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

2022-09-01 15:31:18

在 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

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

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


答案 1

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

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

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

要使用正则表达式属性目标,您需要执行如下操作

<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


答案 2

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

基本上,您希望在pom中类似的东西从中推断出属性:myVersionTagmyValue

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