2009-04-29 5 views
48

Ho un progetto Maven2 e ho bisogno di aggiungere, in un file delle proprietà, la versione corrente e la data corrente.Aggiunta della data corrente con il filtro Maven2

Per la versione corrente, ho utilizzato ${project.version}, che funziona correttamente.

La mia domanda è come posso impostare la data corrente (cioè la data in cui la costruzione è fatto da Maven2) nei miei file di proprietà:

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

(in aggiunta, se posso specificare il formato per il la data, sarà davvero grande)

risposta

44

è possibile utilizzare il Maven Buildnumber Plugin per questo:

<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 data è quindi disponibile nella proprietà $ {} numero build.

+0

e la data corrente nella proprietà: $ {timestamp} Più sopra ho ha dovuto aggiungere un manichino jpprade

+0

Ci scusiamo per la mia modifica: sembra che "" sia usato da questo obiettivo per formattare '$ {buildNumber}' ... Molto confuso. Per coloro che vogliono la build date * e * build date, è necessario avere due esecuzioni per 'buildnumber-maven-plugin': uno con' create' goal (e una configurazione opzionale per esso), e un altro per 'create-timestamp' obiettivo con personalizzato '' nella sua configurazione. Le configurazioni di missaggio non funzionano. –

+0

Ok, mi sento un po 'fasullo, e senza una ricerca online qualcuno potrebbe dirmi perché devo usare la sintassi '{0, date, aaaa-MM-gg HH: mm: ss}' per dire semplicemente 'yyyy- MM-gg HH: mm: ss'? Cosa significa? – reallynice

10

Un'altra soluzione è quella di utilizzare Groovy all'interno del pom.xml (forse non così corretta come la soluzione proposta da 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> 

e quindi utilizzare la proprietà buildtimestamp:

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

Grazie per questo! Il plugin BuildNumber sembra essere abbastanza rotto per me, ma questo ha funzionato come un fascino. – JavadocMD

18

Dal momento che Maven 2.1 M1, ora puoi fare ${maven.build.timestamp} purché tu definisca anche ${maven.build.timestamp.format}

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

Nota: questo non funziona (fino ad ora) nel filtraggio dei file di risorse –

+2

Non funziona anche su M3.04 – fabdouglas

+1

Non credo (al giorno d'oggi) uno * ha bisogno * di fornire ' '. (Io stesso sono stato ingannato nel pensare che un '$ {maven.build.timestamp}' non funzionava, ma poi stavo testando solo usando Eclipse/m2e/WTP. Non appena eseguo qualcosa come 'mvn compile',' $ {maven.build.timestamp} 'viene aggiornato bene.) – Arjan

71

La funzione non funziona con il filtro delle risorse di Maven 2.2.1.

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

ma si potrebbe creare una proprietà personalizzata nel pom genitore:

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

Dove numero build è la nuova proprietà che può essere filtrato nelle risorse.

+2

+1 molto meglio di http://maven.apache.org/plugin-developers/cookbook/add-build-time-to-manifest.html BTW, il codice può anche essere all'interno dello stesso pom.xml in .... – Cojones

+3

Si noti che in un errore in jenkins si impedisce l'utilizzo di questa funzione (solo per il caso jenkins) https://issues.jenkins-ci.org/browse/JENKINS-9693 – Rudy

+0

dopo 3 anni questo problema di Maven è ancora aperto! – Karussell

4

è un lavoro per me in Maven 2.1.0

$ {} maven.build.timestamp

7

Questo ha funzionato per me. Tutto quello che volevo era il timestamp.

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

E in un file JSP ...

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

Esempio risultato è ...

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

simple is beautiful –

11

risposta di Thomas Marti è un passo nella giusta direzione, ma c'è un approccio più semplice che non richiede una dichiarazione fittizia <scm> nel POM. Utilizzare lo buildnumber-maven-plugin, ma utilizzare l'obiettivo create-timestamp.La documentazione non è chiara; ecco quello che sembra per ottenere una data in formato YYYY-MM-DD e metterlo nella proprietà 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> 

Fuori dalla scatola questo non funzionerà in Eclipse con M2E, quindi dovrete aggiungere la seguente all'interno della sezione 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> 

Questo dice M2E che si vuole andare avanti ed eseguire il plugin quando si costruisce all'interno di Eclipse.

Ora quando si costruisce dentro o fuori Eclipse, il timestamp viene generato correttamente e funziona con il filtro delle risorse!

E 'un peccato che la funzionalità in modo semplice deve essere così difficile ...

+0

Questa è l'unica soluzione che abbia mai trovato funzionante in RAD/Eclipse. Grazie. –

+0

Inizialmente ho ignorato la tua risposta a causa di tutti i faff con la configurazione di eclipse che non era necessaria per me (probabilmente perché m2e migliorato da quando lo hai scritto). Ho pubblicato esattamente ciò che ha funzionato per me come risposta separata nella speranza che possa aiutare le persone come me :). – AmanicA

7

Stick ${build.time} in un file delle proprietà e di seguito nel 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> 

vedere anche the buildnumber-maven-plugin documentation.


(Altre risposte mi ha fatto vicino soprattutto Garret Wilson, ma la sua configurazione eclisse non era necessario per me e mi ha causato a ignorare la sua risposta, quindi sto postando esattamente cosa ha funzionato per me.)

come bonus se si desidera ottenere due proprietà uno per la data e uno per tempo, questo è come lo fai:

<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

Ho dovuto usare dummy scm, e mi ha salvato il giorno in cui lo sto usando per i miei strumenti CI, ora jenkins dà build giornalieri e notturni e possiamo installarli su nexus e non dobbiamo abilitare ovrride. – Manoj