Agregar la fecha actual con filtrado Maven2


Tengo un proyecto Maven2, y necesito agregar, en un archivo de propiedades, la versión actual y la fecha actual.

Para la versión actual, he usado ${project.version}, que funciona correctamente.

Mi pregunta es cómo puedo establecer la fecha actual (es decir, la fecha en que Maven2 realiza la compilación) en mi archivo de propiedades:

client.version=Version ${project.version}
client.build=???

(además, si puedo especificar el formato para la fecha, será realmente genial)

Author: Rich Seller, 2009-04-29

8 answers

Puedes usar el plugin Maven Buildnumber para esto:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>buildnumber-maven-plugin</artifactId>
      <executions>
        <execution>
          <phase>initialize</phase>
          <goals>
            <goal>create</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <doCheck>false</doCheck>
        <doUpdate>false</doUpdate>
        <timestampFormat>{0,date,yyyy-MM-dd HH:mm:ss}</timestampFormat>
      </configuration>
    </plugin>
  </plugins>
</build>

La fecha está entonces disponible en la propiedad {{buildNumber}.

 47
Author: Thomas Marti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-05 18:17:44

La característica no funciona con el filtrado de recursos maven 2.2.1.

Véase: http://jira.codehaus.org/browse/MRESOURCES-99

Pero podría crear una propiedad personalizada en el pom padre:

<properties>
    <maven.build.timestamp.format>yyMMdd_HHmm</maven.build.timestamp.format>
    <buildNumber>${maven.build.timestamp}</buildNumber>
</properties>

Donde buildNumber es la nueva propiedad que se puede filtrar en los recursos.

 70
Author: jj.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-16 15:37:42

Desde Maven 2.1 M1, ahora puede hacer ${maven.build.timestamp} siempre que también defina ${maven.build.timestamp.format}

<properties>
    ...
    <maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>
    ...
</properties>
 19
Author: aberrant80,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 07:17:19

La respuesta de Thomas Martí es un paso en la dirección correcta, pero hay un enfoque más simple que no requiere una declaración ficticia <scm> en el POM. Usa el buildnumber-maven-plugin, pero usa el objetivo create-timestamp. La documentación no está clara; así es como se ve obtener una fecha en formato YYYY-MM-DD y ponerla en la propiedad build.date:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create-timestamp</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <timestampFormat>yyyy-MM-dd</timestampFormat>
        <timestampPropertyName>build.date</timestampPropertyName>
    </configuration>
</plugin>

Fuera de la caja esto no funcionará en Eclipse con m2e, por lo que tendrá que agregar lo siguiente dentro de la sección POM <build>:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.eclipse.m2e</groupId>
            <artifactId>lifecycle-mapping</artifactId>
            <version>1.0.0</version>
            <configuration>
                <lifecycleMappingMetadata>
                    <pluginExecutions>
                        <pluginExecution>
                            <pluginExecutionFilter>
                                <groupId>org.codehaus.mojo</groupId>
                                <artifactId>buildnumber-maven-plugin</artifactId>
                                <versionRange>[1.2,)</versionRange>
                                <goals>
                                    <goal>create-timestamp</goal>
                                </goals>
                            </pluginExecutionFilter>
                            <action>
                                <execute>
                                    <runOnConfiguration>true</runOnConfiguration>
                                    <runOnIncremental>true</runOnIncremental>
                                </execute>
                            </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

Esto le dice a m2e que desea para seguir adelante y ejecutar el plugin al construir dentro de Eclipse.

Ahora, cuando se construye dentro o fuera de Eclipse, la marca de tiempo se genera correctamente y funciona con el filtrado de recursos!

Es una pena que la funcionalidad tan simple tenga que ser tan difícil...

 11
Author: Garret Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 16:57:24

Otra solución es usar Groovy dentro del pom.xml (quizás no tan apropiado como la solución propuesta por Thomas Marti):

   <build>
      <resources>
         <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
         </resource>
      </resources>
      <plugins>
         <plugin>
            <groupId>org.codehaus.groovy.maven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <executions>
               <execution>
                  <phase>validate</phase>
                  <goals>
                     <goal>execute</goal>
                  </goals>
                  <configuration>
                     <source>
                     import java.util.Date 
                     import java.text.MessageFormat 
                     def vartimestamp = MessageFormat.format("{0,date,yyyyMMdd-HH:mm:ss}", new Date()) 
                     project.properties['buildtimestamp'] = vartimestamp
                     </source>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>

Y luego use la propiedad buildtimestamp:

client.version=${pom.version}
client.build=${buildtimestamp}
 10
Author: romaintaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 15:54:09

Esto funcionó para mí. Todo lo que quería era la marca de tiempo.

En el pom...

<properties>
    <maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>
    <dev.build.timestamp>${maven.build.timestamp}</dev.build.timestamp>
</properties>
...
<overlay>
   <groupId>mystuff</groupId>
   <artifactId>mystuff.web</artifactId>
   <filtered>true</filtered>
</overlay>

Y en un archivo JSP...

<div>Built: ${dev.build.timestamp}</div>

El resultado del ejemplo es...

<div>Built: 20130419-0835</div>
 8
Author: boz jennings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 16:41:40

Pegue ${build.time} en un archivo de propiedades y lo siguiente en pom.xml:

<build>
   <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.3</version>
        <configuration>
          <timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
          <timestampPropertyName>build.time</timestampPropertyName>
        </configuration>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>create-timestamp</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
   </plugins>
</build>

También vea la documentación del buildnumber-maven-plugin.


(Otras respuestas me acercaron especialmente a Garret Wilson, pero su configuración de eclipse no fue necesaria para mí y me hizo ignorar su respuesta, así que estoy publicando exactamente lo que funcionó para mí.)

Como un bono si desea obtener dos propiedades, una para la fecha y otra para la hora, así es como lo hace:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>buildnumber-maven-plugin</artifactId>
  <version>1.3</version>
  <executions>
    <execution>
      <id>build.date</id>
      <phase>initialize</phase>
      <goals>
        <goal>create-timestamp</goal>
      </goals>
      <configuration>
        <timestampFormat>yyyy-MM-dd</timestampFormat>
        <timestampPropertyName>build.date</timestampPropertyName>
      </configuration>
    </execution>
    <execution>
      <id>build.time</id>
      <phase>initialize</phase>
      <goals>
        <goal>create-timestamp</goal>
      </goals>
      <configuration>
        <timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
        <timestampPropertyName>build.time</timestampPropertyName>
      </configuration>
    </execution>
  </executions>
</plugin>
 7
Author: AmanicA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-03 17:24:39

Es trabajo para mí en maven 2.1.0

Ma {maven.construir.fecha y hora}

 5
Author: elciospy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-24 18:28:02