26

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

...
<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

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

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

4

3 回答 3

39

Mojo 的 Build-Helper Maven 插件可以在这里为您提供帮助。

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

可能regex-property是您想要的,但如果您的版本号符合“标准”,那么另外两个可能会拯救您。

要使用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但如果您处于不同的生命周期(例如站点生命周期),则该值将不可用。

于 2012-08-17T08:29:15.440 回答
5

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

基本上,您希望在您的 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>
于 2012-08-17T08:27:53.393 回答
3

Ihor Kaharlichenko 的回答基本上是正确的,只是它从Codehaus 文档中复制了一个错误。'$' 和'{' 之间不应有'\'。 mojo 没有它就可以工作,也不能与它一起工作。 确实,对正则表达式和 Maven 有基本的了解,我看不出反斜杠应该做什么,而且确实是错误的。

斯蒂芬康诺利的回答正确地省略了反斜杠。当心。
这个错误在整个 SO 中激增,而且 Codehaus 的停业可能永远不会得到解决。

于 2015-11-16T23:09:51.003 回答