How do I add time-stamp information to Maven artifacts?

JavaMaven 2AntUpgrade

Java Problem Overview


I am upgrading a large build-system to use Maven2 instead of Ant, and we have two related requirements that I'm stuck on:

  1. We need to generate a time-stamped artifact, so a part of the package phase (or wherever), instead of building

    project-1.0-SNAPSHOT.jar
    

    we should be building

    project-1.0-20090803125803.jar
    

    (where the 20090803125803 is just a YYYYMMDDHHMMSS time-stamp of when the jar is built).

    The only real requirement is that the time-stamp be a part of the generated file's filename.

  2. The same time-stamp has to be included within a version.properties file inside the generated jar.

This information is included in the generated pom.properties when you run, e.g., mvn package but is commented out:

#Generated by Maven
#Mon Aug 03 12:57:17 PDT 2009

Any ideas on where to start would be helpful! Thanks!

Java Solutions


Solution 1 - Java

Maven versions 2.1.0-M1 or newer have built in special variable maven.build.timestamp.

<build>
  <finalName>${project.artifactId}-${project.version}-${maven.build.timestamp}</finalName>
</build>

See Maven documentation for more details.


For older Maven versions a look at http://code.google.com/p/maven-timestamp-plugin/">maven-timestamp-plugin</a> or http://mojo.codehaus.org/buildnumber-maven-plugin/index.html">buildnumber-maven-plugin</a>;.

If you use maven-timestamp-plugin, you can use something like this to manipulate resulting artifact name.

<build>
   <finalName>${project.artifactId}-${project.version}-${timestamp}</finalName>
</build>

And this configuration for buildnumber-maven-plugin should create a ${timestamp} property which contains the timestamp value. There doesn't seem to be a way to create the version.properties file directly with this plugin.

<configuration>
   <format>{0,date,yyyyMMddHHmmss}</format>
   <items>
      <item>timestamp</item>
   </items>

</configuration>

http://apollo.ucalgary.ca/tlcprojectswiki/index.php/Public/Project_Versioning_-_Best_Practices#Build_Versioning">These</a> http://www.gadberry.com/aaron/2007/05/28/inject-build-time-timestamp-property-using-maven/"> three http://pteropus.blogspot.com/2007/03/from-maven-to-mvn-part-5.html">sites</a> are also worth checking out.

Solution 2 - Java

If you use a version of Maven >= 2.1.0-M1, then you can use the ${maven.build.timestamp} property.

For more info, see: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Available_Variables

Solution 3 - Java

This post (especially the below part) is also very useful and practical for this issue.

Stamping Version Number and Build Time in a Properties File with Maven

The pom will look like this

...
<properties>
        
        ....
        
        <!-- Timestamp of build  -->
        <timestamp>${maven.build.timestamp}</timestamp>
        <maven.build.timestamp.format>yyyy_MM_dd_HH_mm</maven.build.timestamp.format>
        
</properties>

...

<build>
        <finalName>${project.artifactId}-${project.version}-${timestamp}</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
			    <artifactId>maven-compiler-plugin</artifactId>
                ....
            </plugin>
        </plugins>
</build>
....

and the package name is MyProject-1.0. 0-2015_03_02_13_46.war

Solution 4 - Java

If you need the time in a timezone other than UTC (the default when you use ${maven.build.timestamp}) you could use the build-helper-maven-plugin. See more in Brief examples on how to use the Build Helper Maven Plugin's goals.

Anyway, this is how I've got the timestamp in GMT-5 and put it in the final name of my artifact:

  <build>
	  <plugins>
		  <plugin>
			  <groupId>org.codehaus.mojo</groupId>
			  <artifactId>build-helper-maven-plugin</artifactId>
			  <version>1.9.1</version>
			  <executions>
				  <execution>
					  <id>timestamp-property</id>
					  <goals>
						  <goal>timestamp-property</goal>
					  </goals>
					  <configuration>
						  <name>current.time</name>
						  <pattern>yyyyMMdd-HHmmss</pattern>
						  <timeZone>GMT-5</timeZone>
					  </configuration>
				  </execution>
			  </executions>
		  </plugin>
		  <plugin>
			  <groupId>org.apache.maven.plugins</groupId>
			  <artifactId>maven-jar-plugin</artifactId>
			  <version>2.4</version>
			  <configuration>
				  <finalName>${project.name}-${current.time}</finalName>
			  </configuration>
		  </plugin>
	  </plugins>
  </build>

Solution 5 - Java

When a SNAPSHOT project is deployed, by default a timestamp is used unless you override it in the deploy plugin. If you're not getting unique timestamps, it is probably down to a configuration of your Maven repository. As the other answer says though, use the timestamp or buildnumber plugin for releases.

Solution 6 - Java

We need a newer answer :) It is build in now: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Available_Variables

use ${maven.build.timestamp}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRyanView Question on Stackoverflow
Solution 1 - JavaJuha SyrjäläView Answer on Stackoverflow
Solution 2 - JavaHoria ChioreanView Answer on Stackoverflow
Solution 3 - JavamcvkrView Answer on Stackoverflow
Solution 4 - JavalmiguelmhView Answer on Stackoverflow
Solution 5 - JavaRich SellerView Answer on Stackoverflow
Solution 6 - JavaJanView Answer on Stackoverflow