web-dev-qa-db-fra.com

Ajout de la date actuelle avec le filtrage Maven2

J'ai un projet Maven2, et je dois 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 de savoir 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 plus, si je peux spécifier le format de la date, ce sera vraiment super)

50
Romain Linsolas

Vous pouvez utiliser le Maven Buildnumber Plugin pour cela:

<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}.

48
Thomas Marti

La fonctionnalité ne fonctionne pas avec le filtrage des ressources 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.

73
jj.

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

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

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> déclaration dans le POM. Utilisez le buildnumber-maven-plugin, mais utilisez le create-timestamp objectif. La documentation n'est pas claire; voici à quoi ça ressemble pour avoir une date dans YYYY-MM-DD format 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>

Hors de la boîte, cela ne fonctionnera pas dans Eclipse avec m2e, vous devrez donc ajouter ce qui suit à l'intérieur du 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.

Désormais, 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 dommage qu'une fonctionnalité si simple doive être si difficile ...

12
Garret Wilson

Une autre solution consiste à utiliser Groovy dans le pom.xml (peut-être pas aussi approprié 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>

puis utilisez la propriété buildtimestamp:

client.version=${pom.version}
client.build=${buildtimestamp}
11
Romain Linsolas

Cela a fonctionné pour moi. Tout ce que je voulais, c'était l'horodatage.

Dans le pom ...

<properties>
    <maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>
    <dev.build.timestamp>${maven.build.timestamp}</dev.build.timestamp>
</properties>
...
<overlay>
   <groupId>mystuff</groupId>
   <artifactId>mystuff.web</artifactId>
   <filtered>true</filtered>
</overlay>

Et dans un fichier JSP ...

<div>Built: ${dev.build.timestamp}</div>

L'exemple de résultat est ...

<div>Built: 20130419-0835</div>
9
boz jennings

ça marche pour moi chez maven 2.1.0

$ {maven.build.timestamp}

5
elciospy