web-dev-qa-db-fra.com

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

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?

92
kostja

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}
194
kostja

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 .

2
Bob Rivers

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>
1
rogerdpack

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.

0
skay