在Maven中,如何在运行时动态构建属性值?

在maven中,使用以下语法在pom中设置属性非常容易:

...  4.06.17.6  ... 

现在我需要构建一个取决于我的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 

它应该是动态的,因为它在我们的存储库中用作标记名称,并且必须始终与工件的版本同步。

任何想法如何创建“动态”属性?

Mojo的Build-Helper Maven插件可以帮助你。

有许多目标可用于帮助转换属性。

  • 建立辅助:正则表达式属性

  • 建立辅助:解析版本

  • 建立辅助:发布版本

可能正则属性是您想要的属性 ,但如果您的版本号符合“标准”,则其他两个可能会为您节省。

要使用正则表达式属性目标,您可以执行类似的操作

  ...    org.codehaus.mojo build-helper-maven-plugin 1.7   regex-property  regex-property   tag.version ${project.version} ^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$ V$1_$2_$3_P$4 true       ...  

注意:我的正则表达式可能略有偏差,所以你应该测试上面的内容。

注意:属性值仅在此执行绑定的阶段之后可用于执行。 它所绑定的默认阶段是validate但如果您处于不同的生命周期(例如站点生命周期),则该值将不可用。

您可以使用maven build-helper插件,特别是其正则表达式属性mojo 。 查看用法示例 ( 通过将regex替换应用于值部分滚动到设置属性 )。

基本上你想在你的pom中使用类似的东西从myValue获取myVersionTag属性:

  ...    org.codehaus.mojo build-helper-maven-plugin 1.7   regex-property  regex-property   myVersionTag $\{myValue} (\d+)\.(\d+)\.(\d+)\.(\d+) V_$1_$2_$3_P$4       ...  

Ihor Kaharlichenko的答案基本上是正确的,只是它从Codehaus文档中复制了一个错误。 ‘$’和'{‘之间不应该有’\’。 mojo在没有它的情况下工作,并且无法使用它。 真的,基本了解正则表达式和Maven,我无法看到反斜杠应该做什么,确实是错的。

Stephen Connolly的回答正确地省略了反斜杠。 小心。
这个错误在整个SO中蔓延,并且Codehaus停业可能永远不会得到修复。