我來自ANT,您可以通過執行某種方法調用.java文件來獲取版本號。我想在我的新pom.xml中做類似的事情來自動獲取正確的版本號。我需要這個應用程序來了解它自己的版本,同時Maven知道這個版本是否適合構建。保持版本信息翻倍是沒有選擇的。java文件中的Maven版本號
或者Maven可以在構建過程中/之前創建一個新的.java文件?
我可以通過多種方式實現這一目標,但是Maven項目中有沒有最佳實踐方法?
我來自ANT,您可以通過執行某種方法調用.java文件來獲取版本號。我想在我的新pom.xml中做類似的事情來自動獲取正確的版本號。我需要這個應用程序來了解它自己的版本,同時Maven知道這個版本是否適合構建。保持版本信息翻倍是沒有選擇的。java文件中的Maven版本號
或者Maven可以在構建過程中/之前創建一個新的.java文件?
我可以通過多種方式實現這一目標,但是Maven項目中有沒有最佳實踐方法?
在構建JAR時,Maven將pom.xml
和pom.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
密鑰。
這種方法聽起來不錯,但有一點我不明白:如果我在Ecplise中開發並直接使用運行按鈕啓動項目,Maven將不會取代該值。或者我必須始終通過Maven啓動項目? – 2012-01-18 12:39:07
@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
它不清楚你指的是什麼版本號,爲什麼它會在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>
....
得到它我指的是1.0.0-SNAPSHOT。與舊版應用程序通信時,該應用程序需要版本號纔能有不同的工作效果,例如,接口可能已經改變。 – 2012-01-12 02:19:46
我會引用你到SO上的這個線程:How to read an external properties file in Maven。特別是,請查閱Dougnukem的答案,它描述瞭如何將外部屬性文件讀入Maven。您可以使用它作爲共享源來控制Maven構建腳本和Java應用程序中的版本號。
也許如果您在這個要求上多加闡述,我們可以幫助您更多地爲您的問題提供更優雅的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腳本中使用該工件。請注意,此任務的文檔不是很詳細,您可能需要花費一些時間才能使其工作,但至少您會處於熟悉的環境中。
沒有就如何這兩個系統相互影響,以及爲什麼需要這些信息很難挖掘您深入瞭解更多信息。
希望這有助於
我意識到這是很久以前回答,但我已經拿出了對一些可能會發現有用的答案一個新的轉折。
我有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的值填充。
替代品令牌中的通配符.*
表示即使您檢查更新的副本到源代碼管理中,值也會更新。
你可以在maven配置文件中指定版本 - 'pom.xml' – donnior 2012-01-12 01:52:48
是的我知道,但我需要應用程序也知道版本號,因此pom.xml應該讀取版本號一個java文件或者pom.xml應該觸發創建一個帶有版本號的java文件。 – 2012-01-12 02:01:45
Maven具有「過濾器資源」功能,它可以在構建過程中用maven變量替換代碼文件中的某些內容,您需要做的就是將'$ {project.version}'這樣的標記添加到文件中。你可以在http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html – donnior 2012-01-12 02:09:16