J'utilise maven 3.0.4 et voudrais rendre l'horodatage de compilation accessible à mon application. Pour cela, je mets un espace réservé dans un fichier .properties
et laisse maven filtrer lors de la construction. Bien que cela fonctionne bien pour ${project.version}
, ${maven.build.timestamp}
n'est pas substitué lors du filtrage.
La propriété semble être disponible lors de la construction - je peux l'utiliser pour modifier le nom de l'artefact:
<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>
Alors, pourquoi n'est-il pas disponible pour le filtrage des ressources? Et, plus important encore, comment le rendre accessible?
J'ai découvert cet article , en expliquant qu'en raison d'un bogue dans maven , l'horodatage de la construction n'est pas propagé au filtrage. La solution consiste à envelopper l'horodatage dans une autre propriété:
<properties>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>
Le filtrage fonctionne alors comme prévu pour
buildTimestamp=${timestamp}
Afin d’enrichir le contenu de Stackoverflow pour d’autres, comme moi, ce message a été trouvé comme un moyen de résoudre le "problème" de ${maven.build.timestamp}
. Ce n'est pas un bug majeur, mais un comportement attendu de m2e, comme on peut le voir dans this post .
Par conséquent, j'estime que nous ne pouvons pas nous attendre à ce que la solution soit "corrigée", car, d'après ce que je comprends, la correction implique des problèmes conceptuels.
Dans mon cas, j'ai utilisé le plugin (buildnumber-maven-plugin
) tel que décrit dans cet autre message .
Je peux confirmer que, depuis Maven 3.x, {maven.build.timestamp}
fonctionne maintenant. Ils travaillent autour le problème, apparemment. Pas de properties
supplémentaire nécessaire.
Attention toutefois, votre plugin "filtrage" (maven-resources-plugin) est à jour. Il doit être relativement nouveau, donc si mvn help:effective-pom
affiche une ancienne version (ex: 2.6), remplacez-le par un élément plus récent, corrigez-le pour moi, 3.x ex:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
La solution de contournement <properties><timestamp>...
n'est plus requise ...
Cela expliquait aussi, en quelque sorte, pourquoi cela fonctionnait dans IntelliJ mais pas en ligne de commande. IntelliJ utilise probablement ses propres constantes Maven "modifiées/internes", de sorte qu'il fonctionnait là-bas, mais pas à partir de la ligne de commande Maven.
Notez également que si vous ajoutez un répertoire de ressources de filtrage à votre pom, vous devrez peut-être aussi "rajouter" le répertoire par défaut, il sera perdu, par exemple:
<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>
L'ajout de propriétés Maven au niveau du projet pom ne prend pas en compte le fuseau horaire local correct, de sorte que l'horodatage peut sembler incorrect:
<properties><timestamp>${maven.build.timestamp}</timestamp></properties>
L'utilisation de build-helper-maven-plugin applique le timezone et l'heure d'été corrects à l'horodatage:
<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>
Lors de l’emballage, Maven remplacera tout horodatage de jeton dans le dossier/resources, par exemple. resources/version.properties:
build.timestamp = $ {timestamp}
Vous pouvez ensuite charger ce fichier de propriétés dans votre application.