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?
Maven supports a hierarchy of different properties to allow specifying defaults and overriding them at the appropriate level. The properties files in Maven are processed in the following order: Built-in properties are processed. ${basedir}/project. properties ( basedir is replaced by the directory where the project.
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.
You can use maven build-helper plugin, in particular its regex-property mojo. Take a look at usage examples (scroll to Set a property by applying a regex replacement to a value section).
Basically you want something like that in your pom to get myVersionTag
property inferred from 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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With