52 votes

Ajout de la date du jour avec le filtrage de Maven2

J'ai un projet Maven2, et j'ai besoin d'ajouter, dans un fichier de propriétés, la version actuelle et la date actuelle.

Pour la version actuelle, j'ai utilisé ${project.version} qui fonctionne correctement.

Ma question est la suivante : comment puis-je définir la date actuelle (c'est-à-dire la date à laquelle la construction est effectuée par Maven2) dans mon fichier de propriétés ?

client.version=Version ${project.version}
client.build=???

(en outre, si je peux spécifier le format de la date, ce sera vraiment génial)

84voto

jj. Points 1

La fonctionnalité ne fonctionne pas avec le filtrage des ressources de maven 2.2.1.

Voir : https://issues.apache.org/jira/browse/MRESOURCES-99

Mais vous pouvez créer une propriété personnalisée dans le pom parent :

<properties>
    <maven.build.timestamp.format>yyMMdd_HHmm</maven.build.timestamp.format>
    <buildNumber>${maven.build.timestamp}</buildNumber>
</properties>

Où buildNumber est la nouvelle propriété qui peut être filtrée dans les ressources.

3 votes

+1 beaucoup mieux que maven.apache.org/plugin-developers/cookbook/ BTW, votre code peut aussi être à l'intérieur du même pom.xml dans <projet><properties> .... </properties></projet>.

3 votes

Notez qu'un bogue dans Jenkins vous empêche d'utiliser cette fonctionnalité (uniquement dans le cas de Jenkins). issues.jenkins-ci.org/browse/JENKINS-9693

0 votes

Après 3 ans, ce problème de maven est toujours ouvert !

49voto

Thomas Marti Points 617

Vous pouvez utiliser le Plugin Maven Buildnumber pour ça :

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>buildnumber-maven-plugin</artifactId>
      <executions>
        <execution>
          <phase>initialize</phase>
          <goals>
            <goal>create</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <doCheck>false</doCheck>
        <doUpdate>false</doUpdate>
        <timestampFormat>{0,date,yyyy-MM-dd HH:mm:ss}</timestampFormat>
      </configuration>
    </plugin>
  </plugins>
</build>

La date est alors disponible dans la propriété ${buildNumber}.

0 votes

Et la date courante dans la propriété : ${timestamp} De plus, j'ai dû ajouter un <scm> factice

0 votes

Désolé pour mon édition : il semble que <timestampFormat> est utilisé par cet objectif pour formater ${buildNumber} ... Très déroutant. Pour ceux qui veulent le numéro de construction et date de construction, vous devez avoir deux exécutions de buildnumber-maven-plugin : un avec create (et sa configuration optionnelle), et un autre pour l'objectif create-timestamp avec un objectif personnalisé <timestampFormat> dans sa configuration. Le mélange des configurations ne fonctionne pas.

0 votes

Ok, je me sens un peu idiot, et sans chercher en ligne, quelqu'un pourrait-il me dire pourquoi je dois utiliser la syntaxe suivante {0, date, yyyy-MM-dd HH:mm:ss} pour avoir juste dit yyyy-MM-dd HH:mm:ss ? Qu'est-ce que cela signifie ?

25voto

aberrant80 Points 4544

Depuis Maven 2.1 M1, vous pouvez maintenant faire ${maven.build.timestamp} à condition que vous définissiez également ${maven.build.timestamp.format}

<properties>
    ...
    <maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>
    ...
</properties>

7 votes

Note : cela ne fonctionne pas (pour l'instant) dans le filtrage des fichiers de ressources.

1 votes

Je ne pense pas (de nos jours) que l'on besoins pour fournir <maven.build.timestamp.format> . (J'ai moi-même été trompé en pensant qu'une simple ${maven.build.timestamp} n'a pas fonctionné, mais je n'ai testé qu'avec Eclipse/m2e/WTP. Dès que j'exécute quelque chose comme mvn compile , ${maven.build.timestamp} est mis à jour sans problème).

12voto

Garret Wilson Points 2583

La réponse de Thomas Marti est un pas dans la bonne direction, mais il existe une approche plus simple qui ne nécessite pas de mannequin. <scm> dans le POM. Utilisez l'option buildnumber-maven-plugin mais utilisez le create-timestamp but. La documentation n'est pas claire ; voici à quoi ressemble l'introduction d'une date YYYY-MM-DD et le mettre dans le build.date propriété :

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create-timestamp</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <timestampFormat>yyyy-MM-dd</timestampFormat>
        <timestampPropertyName>build.date</timestampPropertyName>
    </configuration>
</plugin>

En l'état, cela ne fonctionnera pas dans Eclipse avec m2e, vous devrez donc ajouter ce qui suit dans le POM <build> section :

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.eclipse.m2e</groupId>
            <artifactId>lifecycle-mapping</artifactId>
            <version>1.0.0</version>
            <configuration>
                <lifecycleMappingMetadata>
                    <pluginExecutions>
                        <pluginExecution>
                            <pluginExecutionFilter>
                                <groupId>org.codehaus.mojo</groupId>
                                <artifactId>buildnumber-maven-plugin</artifactId>
                                <versionRange>[1.2,)</versionRange>
                                <goals>
                                    <goal>create-timestamp</goal>
                                </goals>
                            </pluginExecutionFilter>
                            <action>
                                <execute>
                                    <runOnConfiguration>true</runOnConfiguration>
                                    <runOnIncremental>true</runOnIncremental>
                                </execute>
                            </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

Cela indique à m2e que vous voulez qu'il aille de l'avant et exécute le plugin lors de la construction dans Eclipse.

Maintenant, lorsque vous construisez à l'intérieur ou à l'extérieur d'Eclipse, l'horodatage est correctement généré et fonctionne avec le filtrage des ressources !

C'est une honte qu'une fonctionnalité si simple soit si difficile...

0 votes

C'est la seule solution que j'ai trouvée pour fonctionner dans RAD/Eclipse. Merci.

0 votes

Au départ, j'ai ignoré votre réponse à cause de toutes les manipulations de la configuration d'eclipse qui n'étaient pas nécessaires pour moi (probablement parce que m2e s'est amélioré depuis que vous l'avez écrite). J'ai posté exactement ce qui a fonctionné pour moi dans une réponse séparée dans l'espoir que cela aidera les gens comme moi :).

11voto

romaintaz Points 32120

Une autre solution consiste à utiliser Groovy dans le pom.xml (peut-être pas aussi bien que la solution proposée par Thomas Marti) :

   <build>
      <resources>
         <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
         </resource>
      </resources>
      <plugins>
         <plugin>
            <groupId>org.codehaus.groovy.maven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <executions>
               <execution>
                  <phase>validate</phase>
                  <goals>
                     <goal>execute</goal>
                  </goals>
                  <configuration>
                     <source>
                     import java.util.Date 
                     import java.text.MessageFormat 
                     def vartimestamp = MessageFormat.format("{0,date,yyyyMMdd-HH:mm:ss}", new Date()) 
                     project.properties['buildtimestamp'] = vartimestamp
                     </source>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>

et ensuite utiliser le buildtimestamp propriété :

client.version=${pom.version}
client.build=${buildtimestamp}

1 votes

Merci pour cela ! Le plugin BuildNumber semble ne pas fonctionner pour moi, mais cela a marché comme sur des roulettes.

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