2009-04-29 4 views
48

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.Ajout de la date actuelle avec le filtrage Maven2

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

Ma question est de savoir comment puis-je régler la date (la date à laquelle la construction se fait par Maven2) dans mes propriétés fichier:

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

(en plus, si je peux spécifier le format pour la ce jour, il sera vraiment génial)

Répondre

44

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.

+0

et la date actuelle dans la propriété: $ {horodatage} Plus sur I a dû ajouter un mannequin jpprade

+0

Désolé pour ma modification: il semble que '' soit utilisé par cet objectif pour formater '$ {buildNumber}' ... Très déroutant. Pour ceux qui veulent construire le numéro * et * la date de construction, vous devez avoir deux exécutions pour 'buildnumber-maven-plugin': une avec l'objectif' create' (et une configuration optionnelle), et une autre pour 'create-timestamp' objectif avec custom '' dans sa configuration. Le mélange des configurations ne fonctionne pas. –

+0

Ok, je me sens un peu fictif, et sans chercher en ligne, quelqu'un pourrait-il me dire pourquoi je dois utiliser la syntaxe '{0, date, aaaa-MM-jj HH: mm: ss}' juste pour dire 'yyyy- MM-dd HH: mm: ss'? Qu'est-ce que ça veut dire? – reallynice

10

Une autre solution consiste à utiliser Groovy à l'intérieur du pom.xml (peut-être pas aussi bonne 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} 
+1

Merci pour ça! Le plugin BuildNumber semble être assez cassé pour moi mais cela a fonctionné comme un charme. – JavadocMD

18

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> 
+7

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

+2

Ne fonctionne pas sur M3.04 aussi – fabdouglas

+1

Je ne pense pas (de nos jours) un * doit * fournir ' '. (J'ai moi-même été dupé en pensant qu'un '$ {maven.build.timestamp}' ne fonctionnait pas, mais que je ne faisais que tester Eclipse/m2e/WTP, dès que je lance quelque chose comme 'mvn compile',' $ {maven.build.timestamp} 'est très bien mis à jour.) – Arjan

71

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

Voir: http://jira.codehaus.org/browse/MRESOURCES-99

Mais vous pouvez créer une propriété personnalisée dans la pom-mère:

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

+2

+1 beaucoup mieux que http://maven.apache.org/plugin-developers/cookbook/add-build-time-to-manifest.html BTW, vous codez peut également être dans le même pom.xml dans .... – Cojones

+3

Notez que dans un bug dans jenkins vous empêche d'utiliser cette fonctionnalité (uniquement pour le cas de jenkins seulement) https://issues.jenkins-ci.org/browse/JENKINS-9693 – Rudy

+0

après 3 ans ce numéro de maven est toujours ouvert! – Karussell

4

c'est un travail pour moi à Maven 2.1.0

$ {} maven.build.timestamp

7

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> 
+0

simple est belle –

11

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

<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, de sorte que vous devrez ajouter ce qui suit à l'intérieur de 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 voulez aller de l'avant et d'exécuter le plug-in lors de la construction au sein d'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!

Il est dommage que la fonctionnalité si simple doit être si difficile ...

+0

C'est la seule solution que j'ai trouvé dans RAD/Eclipse. Je vous remercie. –

+0

Initialement, j'ai ignoré votre réponse à cause de tout le faffing avec la configuration d'éclipse qui n'était pas nécessaire pour moi (probablement parce que m2e s'est amélioré depuis que vous l'avez écrit). J'ai posté exactement ce qui a fonctionné pour moi comme une réponse séparée dans l'espoir que cela aidera les gens comme moi :). – AmanicA

7

bâton ${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 the buildnumber-maven-plugin documentation.


(D'autres réponses me ont surtout près Garret Wilson, mais sa configuration éclipse n'a pas été nécessaire pour moi et cela m'a causé d'ignorer sa réponse, donc je poste exactement ce qui a fonctionné pour moi.)

en tant que prime si vous voulez obtenir deux propriétés une date et d'un pour le temps, voici comment vous le faites:

<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> 
+0

Je devais utiliser scm factice, et il a sauvé ma journée je l'utilise pour mes outils de CI, maintenant jenkins donne la construction quotidienne et nocturne et nous pouvons installer à nexus et nous ne devons pas activer ovrride. – Manoj

Questions connexes