Comment accéder à maven.build.timestamp pour le filtrage des ressources

107

J'utilise maven 3.0.4 et je souhaite rendre l'horodatage de construction accessible à mon application. Pour cela, je mets un espace réservé dans un .propertiesfichier et laisse maven filtrer lors de la construction. Bien que cela fonctionne bien ${project.version}, ${maven.build.timestamp}n'est pas substitué au 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?

Kostja
la source

Réponses:

220

J'ai découvert cet article , expliquant qu'en raison d'un bogue dans maven , l'horodatage de la construction ne se propage pas au filtrage. La solution de contournement consiste à encapsuler 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}
Kostja
la source
1
Juste une note pour les autres, j'ai eu un problème avec cela, car j'utilise Tomcat dans Eclipse et il semble que cela ne fonctionne pas bien - le remplacement est ok dans le target/${project}dossier, mais dans ma configuration actuelle, Tomcat n'utilise pas ce dossier ...
Betlista
3
@Betlista ouais, l'intégration du serveur dans eclipse semble utiliser le répertoire source. C'est l'une des raisons pour lesquelles j'ai abandonné l'intégration eclipse et utilisé maven depuis la ligne de commande.
kostja
1
Étant donné qu'il y a plusieurs endroits dans un pom où j'ai besoin d'un horodatage, mais dans des formats différents (par exemple un nom de fichier et une chaîne d'heure de construction), comment puis-je l'utiliser maven.build.timestamp.formatplusieurs fois?
Daniel Alder
13
Pas de travail. Le filtrage remplace ${timestamp}par la chaîne littérale ${maven.build.timestamp}.
Kevin Krumwiede
1
Si vous utilisez SpringBoot, vous devez écrirebuildTimestamp=@timestamp@
Julien Feniou
10

Je peux confirmer que Maven 3.x {maven.build.timestamp}"fonctionne" maintenant. Ils ont contourné le problème, apparemment. Aucune propertiessolution de contournement supplémentaire n'est plus nécessaire.

Attention cependant votre plugin "filtering" (maven-resources-plugin) est à jour. Il doit être relativement nouveau, donc si mvn help:effective-pommontre une ancienne version (ex: 2.6), remplacez-la par quelque chose de 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>

<properties><timestamp>... la solution de contournement n'est plus nécessaire ...

Cela a également clarifié, en quelque sorte, pourquoi cela fonctionnait dans IntelliJ mais pas dans la ligne de commande. IntelliJ utilise probablement ses propres constantes maven "modifiées / internes", donc il fonctionnait là-bas, mais pas depuis la ligne de commande maven.

Notez également que si vous ajoutez un répertoire de ressources de filtrage à votre pom, vous devrez peut-être également "rajouter" le répertoire par défaut, il se perd, ex:

  <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 vous utilisez Spring Boot comme parent, vous devez utiliser @ maven.build.timestamp @ à la place . Notez également que si vous utilisez spring boot, il y a un fichier META-INF/build-info.propertiesqui est éventuellement créé par le spring-boot-maven-pluginque vous pouvez lire (spring fournit un BuildPropertiesbean pour faciliter sa lecture).

rogerdpack
la source
1
Malheureusement, cela ne fonctionne pas encore pour maven-war-plugin ( <webResources><resource><filtering>) :-( voir MWAR-415 -> il faut donc toujours utiliser la solution de contournement là
msa le
1
Différents plugins filtrent différemment. Si vous utilisez le filtrage dans maven-assembly-plugin v3.3.0, le $ {maven.build.timestamp} n'est toujours pas directement disponible et vous devez utiliser la <properties><timestamp>...solution de contournement. Voir aussi issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Afin d'enrichir le contenu Stackoverflow pour d'autres, qui comme moi, ont trouvé ce post comme un moyen de résoudre le "problème" de ${maven.build.timestamp}. Ce n'est pas un bug maven, mais un comportement attendu de m2e, comme on peut le voir dans cet article .

Par conséquent, je crois 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) comme décrit dans cet autre article .

Bob Rivers
la source
J'ai trouvé buildnumber-maven-plugindes problèmes similaires, à savoir que la variable qu'elle génère n'est disponible que dans certains contextes, PAS de filtrage. Vous pouvez ou non être en mesure de surmonter cela en bricolant la phase d'exécution ou les objectifs, mais la solution intégrée semble tellement plus simple.
MarkHu
1

L'ajout de propriétés Maven au niveau du projet pom ne prend pas en compte le fuseau horaire local correct, donc l'horodatage peut sembler incorrect:

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

L'utilisation de build-helper-maven-plugin applique le fuseau horaire correct et l'heure d'été actuelle à 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'empaquetage, Maven remplacera tout horodatage de jeton dans le dossier / resources, par exemple resources / version.properties:

build.timestamp = $ {horodatage}

Vous pouvez ensuite charger ce fichier de propriétés dans votre application.

skay
la source