Question

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 de savoir comment 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)

Était-ce utile?

La solution

Vous pouvez utiliser le plug-in de numéro de version Maven pour ce faire:

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

Autres conseils

La fonctionnalité ne fonctionne pas avec le filtrage de 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é pouvant être filtrée dans les ressources.

Depuis Maven 2.1 M1, vous pouvez maintenant le 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>

La réponse de Thomas Marti est un pas dans la bonne direction, mais il existe une approche plus simple qui n'exige pas de déclaration factice <scm> dans le POM. Utilisez le buildnumber-maven-plugin, mais utilisez l’objectif create-timestamp. La documentation n'est pas claire. voici à quoi il ressemble pour obtenir une date au format YYYY-MM-DD et la placer dans la 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>

Cela ne fonctionnera pas dans Eclipse avec m2e. Vous devrez donc ajouter les éléments suivants dans la section POM <build>:

<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 souhaitez qu'il exécute le plug-in 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!

Dommage que les fonctionnalités si simples soient si difficiles à exécuter ...

Une autre solution consiste à utiliser Groovy dans le fichier 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 buildtimestamp propriété:

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

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>

Exemple de résultat est ...

<div>Built: 20130419-0835</div>

Collez ${build.time} dans un fichier de propriétés et les éléments suivants dans pom.xml:

<build>
   <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.3</version>
        <configuration>
          <timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
          <timestampPropertyName>build.time</timestampPropertyName>
        </configuration>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>create-timestamp</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
   </plugins>
</build>

Voir aussi la documentation buildnumber-maven-plugin .

(D'autres réponses m'ont rapproché, en particulier Garret Wilson, mais sa configuration pour l'éclipse n'était pas nécessaire pour moi et cela m'a fait ignorer sa réponse. Je publie donc exactement ce qui a fonctionné pour moi.)

En tant que bonus , si vous souhaitez obtenir deux propriétés, l'une pour la date et l'autre pour l'heure, procédez comme suit:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>buildnumber-maven-plugin</artifactId>
  <version>1.3</version>
  <executions>
    <execution>
      <id>build.date</id>
      <phase>initialize</phase>
      <goals>
        <goal>create-timestamp</goal>
      </goals>
      <configuration>
        <timestampFormat>yyyy-MM-dd</timestampFormat>
        <timestampPropertyName>build.date</timestampPropertyName>
      </configuration>
    </execution>
    <execution>
      <id>build.time</id>
      <phase>initialize</phase>
      <goals>
        <goal>create-timestamp</goal>
      </goals>
      <configuration>
        <timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
        <timestampPropertyName>build.time</timestampPropertyName>
      </configuration>
    </execution>
  </executions>
</plugin>

ça marche pour moi chez maven 2.1.0

$ {maven.build.timestamp}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top