Cómo acceder a maven.build.timestamp para el filtrado de recursos

107

Estoy usando maven 3.0.4 y me gustaría que la marca de tiempo de compilación sea accesible para mi aplicación. Para esto, coloco un marcador de posición en un .propertiesarchivo y dejo que maven filtre en la compilación. Si bien esto funciona bien ${project.version}, ${maven.build.timestamp}no se sustituye en el filtrado.

La propiedad parece estar disponible en la compilación; puedo usarla para modificar el nombre del artefacto:

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

Entonces, ¿por qué no está disponible para el filtrado de recursos? Y, lo que es más importante, ¿cómo lo hago accesible?

kostja
fuente

Respuestas:

220

Descubrí este artículo , explicando que debido a un error en maven , la marca de tiempo de compilación no se propaga al filtrado. La solución es ajustar la marca de tiempo en otra propiedad:

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>

El filtrado funciona como se esperaba para

buildTimestamp=${timestamp}
kostja
fuente
1
Solo una nota para otros, tuve un problema con eso, porque estoy usando Tomcat dentro de Eclipse y parece que no funciona bien: el reemplazo está bien en la target/${project}carpeta, pero en mi configuración actual, Tomcat no está usando esta carpeta ...
Betlista
3
@Betlista sí, la integración del servidor en eclipse parece usar el directorio de origen. Fue una de las razones por las que abandoné la integración de eclipse y utilicé maven desde la línea de comandos.
kostja
1
Dado que hay varios lugares en un pom donde necesito una marca de tiempo, pero en diferentes formatos (por ejemplo, un nombre de archivo y una cadena de tiempo de compilación), ¿cómo puedo usar maven.build.timestamp.formatvarias veces?
Daniel Alder
13
No funciona. El filtrado se reemplaza ${timestamp}con la cadena literal ${maven.build.timestamp}.
Kevin Krumwiede
1
Si está utilizando SpringBoot, debe escribirbuildTimestamp=@timestamp@
Julien Feniou
10

Puedo confirmar que Maven 3.x {maven.build.timestamp}está "funcionando" ahora. Trabajan alrededor del problema, aparentemente. Ya no se propertiesnecesitan soluciones adicionales .

Sin embargo, tenga cuidado de que su complemento de "filtrado" (maven-resources-plugin) esté actualizado. Debe ser relativamente nuevo, por lo que si mvn help:effective-pommuestra una versión anterior (por ejemplo: 2.6), colóquela en algo más nuevo, arregló para mí, 3.x por ejemplo:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
</plugin>

<properties><timestamp>... Ya no se requiere una solución alternativa ...

Esto también aclaró, en cierto modo, por qué estaba funcionando en IntelliJ pero no en la línea de comandos. IntelliJ probablemente usa sus propias constantes de maven "modificadas / internas", por lo que estaba funcionando allí, pero no desde la línea de comandos de Maven.

También tenga en cuenta que si agrega un directorio de recursos de filtrado a su pom, es posible que también deba "volver a agregar" el directorio predeterminado, se pierde, por ejemplo:

  <resource>
    <directory>src/main/resources-filtered</directory> <!-- to get "maven.build.timestamp" into resource properties file -->
    <filtering>true</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory> <!-- apparently have to add this is you have the other... -->
  </resource>

NB, si está usando Spring Boot como padre, debe usar @ maven.build.timestamp @ en su lugar . También tenga en cuenta que si está usando Spring Boot, hay un archivo META-INF/build-info.propertiesque es creado opcionalmente por el spring-boot-maven-pluginque puede leer (Spring proporciona un BuildPropertiesbean para mayor comodidad al leerlo).

Rogerdpack
fuente
1
Desafortunadamente, esto aún no funciona para maven-war-plugin ( <webResources><resource><filtering>) :-( vea MWAR-415 -> así que todavía tengo que usar la solución allí
msa
1
Los diferentes complementos filtran de manera diferente. Si usa el filtrado dentro de maven-assembly-plugin v3.3.0, $ {maven.build.timestamp} todavía no está disponible directamente y debe usar la <properties><timestamp>...solución alternativa. Ver también issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Con el fin de enriquecer el contenido de Stackoverflow para otros, que como yo, encontraron esta publicación como una forma de resolver el "problema" de ${maven.build.timestamp}. Esto no es un error de maven, sino un comportamiento esperado de m2e, como se puede ver en esta publicación .

Por tanto, creo que no podemos esperar que la solución se "corrija", ya que, por lo que entiendo, la corrección involucra cuestiones conceptuales.

En mi caso, lo que hice fue usar el complemento ( buildnumber-maven-plugin) como se describe en esta otra publicación .

Bob Rivers
fuente
Descubrí buildnumber-maven-pluginque tengo problemas similares, es decir, que la variable que genera solo está disponible en ciertos contextos, NO filtrando. Es posible que pueda o no superarlo modificando la fase de ejecución o los objetivos, pero la solución incorporada parece mucho más simple.
MarkHu
1

Agregar propiedades de Maven en el nivel del proyecto pom no tiene en cuenta la zona horaria local correcta, por lo que la marca de tiempo puede parecer incorrecta:

<properties><timestamp>${maven.build.timestamp}</timestamp></properties>

El uso de build-helper-maven-plugin aplica la zona horaria correcta y el horario de verano actual a la marca de tiempo:

<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>timestamp</name>
                        <pattern>yyyy-MM-dd HH:mm:ss</pattern>
                        <timeZone>Europe/Zurich</timeZone>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
         </resource>
     </resources>
 </build>

Al empaquetar, Maven reemplazará cualquier marca de tiempo del token en la carpeta / resources, por ejemplo, resources / version.properties:

build.timestamp = $ {timestamp}

A continuación, puede cargar este archivo de propiedades en su aplicación.

skay
fuente