2012-01-12 153 views
12

我來自ANT,您可以通過執行某種方法調用.java文件來獲取版本號。我想在我的新pom.xml中做類似的事情來自動獲取正確的版本號。我需要這個應用程序來了解它自己的版本,同時Maven知道這個版本是否適合構建。保持版本信息翻倍是沒有選擇的。java文件中的Maven版本號

或者Maven可以在構建過程中/之前創建一個新的.java文件?

我可以通過多種方式實現這一目標,但是Maven項目中有沒有最佳實踐方法?

+0

你可以在maven配置文件中指定版本 - 'pom.xml' – donnior 2012-01-12 01:52:48

+0

是的我知道,但我需要應用程序也知道版本號,因此pom.xml應該讀取版本號一個java文件或者pom.xml應該觸發創建一個帶有版本號的java文件。 – 2012-01-12 02:01:45

+0

Maven具有「過濾器資源」功能,它可以在構建過程中用maven變量替換代碼文件中的某些內容,您需要做的就是將'$ {project.version}'這樣的標記添加到文件中。你可以在http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html – donnior 2012-01-12 02:09:16

回答

20

在構建JAR時,Maven將pom.xmlpom.properties文件寫入META-INF/maven/[group ID]/[artifact ID]目錄。然後,您可以在應用程序中讀取其中的一個版本。

或者,您可以使用resource filtering顯式編寫新的version.properties文件。

如果你把你的POM如下:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
</build> 

,然後把version.properties模板到在src/main/resources目錄,看起來像:

version = ${project.version} 

Maven會在替補版本讀出POM,然後您的應用程序只需要讀取version.properties資源並查詢version密鑰。

+0

這種方法聽起來不錯,但有一點我不明白:如果我在Ecplise中開發並直接使用運行按鈕啓動項目,Maven將不會取代該值。或者我必須始終通過Maven啓動項目? – 2012-01-18 12:39:07

+0

@Franz True,Maven需要運行並重寫Eclipse的文件才能找到它。您可以將target/build/classes目錄添加爲源文件夾,以便Eclipse獲取重寫的文件,或者可以明確地使資源插件運行,並將其輸出文件生成到不同的目錄,並將其作爲Eclipse中的源文件夾。另外,我不知道最新的M2Eclipse有多複雜,但也許它可以處理過濾的資源。 (請參閱http://stackoverflow.com/questions/2773474/m2eclipse-resource-filtering) – prunge 2012-01-19 06:05:13

0

它不清楚你指的是什麼版本號,爲什麼它會在java文件中。 但是,如果您試圖將版本號分配給您的項目,而不是遵循標準的Maven約定。這裏是一個例子:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myco.abc</groupId> 
    <artifactId>myapp</artifactId> 
    <packaging>war</packaging> 
    <version>1.0.0-SNAPSHOT</version> 

    <name>My App</name> 
    <description>My application description.</description> 
    <url>http://myapp.myco.com</url> 
.... 
+0

得到它我指的是1.0.0-SNAPSHOT。與舊版應用程序通信時,該應用程序需要版本號纔能有不同的工作效果,例如,接口可能已經改變。 – 2012-01-12 02:19:46

1

我會引用你到SO上的這個線程:How to read an external properties file in Maven。特別是,請查閱Dougnukem的答案,它描述瞭如何將外部屬性文件讀入Maven。您可以使用它作爲共享源來控制Maven構建腳本和Java應用程序中的版本號。

1

也許如果您在這個要求上多加闡述,我們可以幫助您更多地爲您的問題提供更優雅的mavenish解決方案。很可惜,第二個應用程序是什麼,它是從Maven發起的,如果是的話,它在啓動過程的哪個階段呢?這個應用程序和Maven有什麼交互作用?

有很多方法可以實現,但選擇正確一個很大程度上取決於您的特定情況,您的問題中沒有足夠的信息來深入挖掘更全面的解決方案。這就是說,下面浮現在腦海:

  • External properties:你可以從Maven外部或者直接創建一個屬性文件生成過程。你可以從你的其他應用程序讀取這個屬性文件。

  • 過濾:正如其他人所說,有可能讓Maven過濾一個資源文件。此文件可以是一個java文件,您可以在其中插入當前版本號並從其他應用程序調用此文件。

  • 從Maven的打電話給你的應用程序構建和傳遞參數:您可以使用exec插件,並調用您的應用程序傳遞當前版本號$ {} project.version的Maven的子過程。

  • Integrate您在Maven的舊​​Ant構建:您可以直接調用一些Ant片段或從Maven完成ant構建。這會讓你產生一個混合構建系統,這可能不是最好的,但仍然可以讓你在遷移過程中有一些餘地,並且可以管理較老的Ant腳本,將切片功能慢慢遷移到Maven。並不是說混合兩者並不一定很糟糕,只是Maven提供了很多硬連接或準硬連線的配置約定,Ant腳本可能會干擾。在這方面可能很難讓雙方都很好。

  • ant驅動您的Maven版本:您也可以做相反的事情,即從螞蟻驅動Maven構建過程,從而保持對如何調用其他系統的控制。通過集成正確的東西(例如屬性或過濾器),您可以確保Maven從特定項目中生成必要的工件,您可以稍後在Ant腳本中使用該工件。請注意,此任務的文檔不是很詳細,您可能需要花費一些時間才能使其工作,但至少您會處於熟悉的環境中。

沒有就如何這兩個系統相互影響,以及爲什麼需要這些信息很難挖掘您深入瞭解更多信息。

希望這有助於

0

我意識到這是很久以前回答,但我已經拿出了對一些可能會發現有用的答案一個新的轉折。

我有replacer插件更改每個MAVEN構建上的Java文件中的字符串。所以,如果pom.xml曾經更新過pom項目的版本號,它會自動反映到一個java源文件中。

告訴MAVEN關於本replace目標:

<build> 
    ... 
    <pluginManagement> 
     <plugins> 
      <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> 
      <plugin> 
       <groupId>org.eclipse.m2e</groupId> 
       <artifactId>lifecycle-mapping</artifactId> 
       <version>1.0.0</version> 
       <configuration> 
        <lifecycleMappingMetadata> 
         <pluginExecutions> 
          <pluginExecution> 
           <pluginExecutionFilter> 
            <groupId> 
             com.google.code.maven-replacer-plugin 
            </groupId> 
            <artifactId> 
             replacer 
            </artifactId> 
            <versionRange> 
             [1.5.3,) 
            </versionRange> 
            <goals> 
             <goal>replace</goal> 
            </goals> 
           </pluginExecutionFilter> 
           <action> 
            <execute /> 
            <runOnIncremental>true</runOnIncremental> 
           </action> 
          </pluginExecution> 
         </pluginExecutions> 
        </lifecycleMappingMetadata> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
    ... 
</build> 

告訴Maven來填補當前的名稱及版本:

(如果你願意的話,把完整的子路徑在basedir和刪除所述**/從包含文件名)

<build> 
    ... 
    <plugins> 
     <plugin> 
      <groupId>com.google.code.maven-replacer-plugin</groupId> 
      <artifactId>replacer</artifactId> 
      <version>1.5.3</version> 
      <executions> 
       <execution> 
        <id>replace-version-number</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>replace</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <basedir>${project.basedir}/src/main/java</basedir> 
       <includes> 
        <include>**/Constants.java</include> 
       </includes> 
       <preserveDir>true</preserveDir> 
       <replacements> 
        <replacement> 
         <token>mavenProjectName = ".*"</token> 
         <value>mavenProjectName = "${project.name}"</value> 
        </replacement> 
        <replacement> 
         <token>mavenProjectVersion = ".*"</token> 
         <value>mavenProjectVersion = "${project.version}"</value> 
        </replacement> 
       </replacements> 
      </configuration> 
     </plugin> 
     .... 
    </plugins> 
    ... 
</build> 

IN Constants.java:

... 
private static final String mavenProjectName = ""; 
private static final String mavenProjectVersion = ""; 
... 

在編譯階段之前,值將在generate_sources階段用POM的值填充。

替代品令牌中的通配符.*表示即使您檢查更新的副本到源代碼管理中,值也會更新。