2012-08-17 54 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歇业可能永远不会得到解决。

相关问题