118 votes

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

J'utilise maven 3.0.4 et je voudrais rendre l'horodatage de la construction accessible à mon application. Pour cela, je mets un placeholder dans un fichier de type .properties et laisser 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 à 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 puis-je le rendre accessible ?

237voto

kostja Points 20153

J'ai découvert cet article en expliquant qu'en raison d'une bogue dans maven l'horodatage de la construction n'est pas propagé au filtrage. La solution consiste à intégrer 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}

1 votes

Juste une note pour les autres, j'ai eu un problème avec cela, parce que j'utilise Tomcat dans Eclipse et il semble que cela ne fonctionne pas bien - le remplacement est ok dans target/${project} mais dans ma configuration actuelle, Tomcat n'utilise pas ce dossier...

3 votes

@Betlista oui, 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 d'eclipse et utilise maven depuis la ligne de commande.

1 votes

Étant donné qu'il y a de multiples 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 de temps de construction), comment puis-je utiliser maven.build.timestamp.format plusieurs fois ?

19voto

rogerdpack Points 12806

Je peux confirmer qu'à partir de Maven 3.x {maven.build.timestamp} est en train de "fonctionner". Ils travail contourné le problème, apparemment. Pas de supplément properties plus besoin de solution de contournement.

Cependant, faites attention à ce que votre plugin de "filtrage" (maven-resources-plugin) soit à jour. Il doit être relativement récent, donc si mvn help:effective-pom montre une ancienne version (ex : 2.6), passe à une version plus récente, ce qui a été fait pour moi, ex : 3.x :

<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 permis de comprendre, 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 que cela fonctionnait là, 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 "ré-adhérer" le répertoire par défaut, il se perd, 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>

NB : si vous utilisez spring boot comme parent, vous devez utiliser @maven.build.timestamp@. au lieu de . Notez également que si vous utilisez spring boot, il existe un fichier META-INF/build-info.properties qui est facultativement créé par le spring-boot-maven-plugin que vous pouvez lire (le ressort fournit un BuildProperties pour en faciliter la lecture).

2 votes

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.

1 votes

Les différents plugins effectuent le filtrage différemment. Si vous utilisez le filtrage au sein du plugin maven-assembly-plugin v3.3.0, le ${maven.build.timestamp} n'est toujours pas directement disponible, et vous devez utiliser la commande <properties><timestamp>... solution de contournement. Voir aussi issues.apache.org/jira/browse/MASSEMBLY-603

0 votes

La solution build-info goal fonctionne comme une alternative, mais notez que vous devez mettre build-info goal avant par exemple repackage goal, si vous avez déjà défini repackage. comme une note en passant, je n'ai pas pu faire fonctionner maven.build.timestamp.format, donc j'ai fini par formater le timestamp sur le frontend - pas de gros problème

4voto

Bob Rivers Points 805

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

Par conséquent, je pense que nous ne pouvons pas nous attendre à ce que la solution soit "corrigée", puisque, d'après ce que je comprends, la correction concerne des questions conceptuelles.

Dans mon cas, ce que j'ai fait, c'est utiliser le plugin ( buildnumber-maven-plugin ) comme décrit dans le présent document. autre poste .

0 votes

J'ai trouvé buildnumber-maven-plugin a des problèmes similaires, à savoir que la variable qu'il génère n'est disponible que dans certains contextes, PAS de filtrage. Vous pouvez ou non être en mesure de surmonter ce problème en modifiant la phase d'exécution ou les objectifs, mais la solution intégrée semble tellement plus simple.

4voto

skay Points 121

L'ajout de propriétés Maven au niveau du projet pom ne tient pas compte du fuseau horaire local correct, de sorte que l'horodatage peut apparaître erroné :

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

L'utilisation du plugin build-helper-maven 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 timestamp 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.

0 votes

Cette réponse a été superbe, sinon l'UTM s'applique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X