Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 386
EhmKah a.k.a. Michael Krauße Avatar asked Aug 17 '12 08:08

EhmKah a.k.a. Michael Krauße


People also ask

What is properties file in Maven?

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.


2 Answers

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.

like image 185
Stephen Connolly Avatar answered Sep 16 '22 13:09

Stephen Connolly


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> 
like image 22
Ihor Kaharlichenko Avatar answered Sep 17 '22 13:09

Ihor Kaharlichenko