2012-08-17 49 views
13

在行家它是很容易與以下語法,在POM來設置屬性:在Maven中,我如何在運行時動態構建屬性值?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

現在我需要建立這取決於我的POM的版本屬性。爲了創建屬性我想要做以下(java的僞代碼):

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

應該是動態的,因爲它被用作我們的資料庫標籤名稱,必須始終保持同步的版本神器。

任何想法如何創建「動態」屬性?

回答

25

魔的Build-助手Maven插件可以幫助你在這裏。

有許多目標可以用來幫助轉換屬性。

也許regex-property是你想要的,但如果你的v ersion號碼符合其他兩個可能爲您節省的「標準」。

要使用regex-property目標,你會做這樣的事情

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

注:我的正則表達式可能會稍微偏離,所以你應該測試以上。

注意:只有在執行綁定的階段之後,該屬性值纔可用於執行。它綁定的默認階段是validate,但是如果您處於不同的生命週期(例如站點生命週期),則該值將不可用。

+0

並且如果我沒有將插件綁定到某個階段。我使用Maven發佈插件並調用目標版本:準備。如何使它在這裏可用? – EhmKah 2012-08-17 09:52:07

+0

如果您沒有指定階段,默認情況下它會綁定到「validate」階段,所以上面的代碼片段將在validate階段處於活動狀態時執行目標。當你直接調用一個目標時,例如'release:prepare',會發生什麼是maven直接跳過任何生命週期階段的目標,所以'release:prepare'目標本身不會看到屬性*,但'release:prepare'會看到生命週期*分叉*它。因此,'release:prepare'將無法使用該屬性來標記SCM,但該屬性將出現在發佈插件運行的分支構建中 – 2012-08-17 09:59:21

+1

如果您想要基於屬性獲得SCM標記(應該更新你的問題反映這是你的目標,或者開始第二個問題),那麼你可能需要使用類似http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormat那不會給你你想要的'_'替換和'_P'注入。我建議更改標籤名稱要求,而不是試圖彎曲Maven ;-) – 2012-08-17 10:02:40

2

你可以使用maven build-helper插件,特別是它的regex-property mojo。看看usage examples(滾動到通過應用正則表達式替換值部分來設置屬性)。

基本上你想要的東西一樣,在你的POM得到myVersionTag財產推斷從myValue

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

我本來也將這個答案標記爲接受,因爲它與上面的一樣。謝謝。 – EhmKah 2012-08-17 10:57:49

+1

不完全。 Ihor的示例在元素中的'$'和'{'之間放置了一個'\'。這就是Codehaus文件所說的做法,但這是錯誤的。正則表達式的目標將不會與反斜槓一起工作,並且在沒有它的情況下工作。 Codehaus已經無法正常工作。 – 2015-11-16 23:01:05

+0

@SteveCohen如果文檔錯誤,請打開問題https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise 2016-09-02 08:25:01

2

Ihor Kaharlichenko的答案基本上是正確的,只不過它從Codehaus documentation複製了一個錯誤。 '$'和'{'之間不應該有'\'。 mojo沒有它,並沒有與它一起工作。真正地,對正則表達式和Maven的基本理解,我看不到反斜槓應該做什麼,而且事實上它是錯誤的。

Stephen Connolly的答案正確地忽略了反斜槓。小心。
這個錯誤在整個SO中已經氾濫成災,Codehaus歇業可能永遠不會得到解決。

相關問題