In Maven, how can I dynamically build a property value at runtime?

java, maven, properties

Solution

Mojo's Build-Helper Maven Plugin can help you out here.

There are a number of goals that can be used to help transform properties.

There is

build-helper:regex-property

build-helper:parse-version

build-helper:released-version

Probably regex-property is the one you want, but if your version numbers conform to the "standards" the other two might save you.

To use the regex-property goal you would do something like

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

Note: my regex might be slightly off so you should test the above.

Note: The property value will only be available for executions after the phase that this execution is bound to. The default phase that it is bound to is `validate` but if you are on a different lifecycle (e.g. the site lifecycle) the value will not be available.

Problem

In maven it is very easy to set properties in a pom with the following syntax: ``` ... <properties> <myValue>4.06.17.6</myValue> </properties> ... ``` Now I need to build a property which depends on the version of my pom. For creating the property i want to do the following (java pseudo code): ``` 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 ``` It should be dynamic, because it is used as a tag name in our repository and must always be in sync with the version of the artifact. Any ideas how to create that "dynamic" properties?

Original source