Come accedere a maven.build.timestamp per il filtraggio delle risorse


107

Sto usando Maven 3.0.4 e vorrei rendere il timestamp di build accessibile alla mia applicazione. Per questo, metto un segnaposto in un .propertiesfile e lascio che Maven filtri sulla build. Sebbene funzioni correttamente ${project.version}, ${maven.build.timestamp}non viene sostituito dal filtro.

La proprietà sembra essere disponibile su build: posso usarla per modificare il nome del manufatto:

<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>

Allora perché non è disponibile per il filtraggio delle risorse? E, soprattutto, come lo rendo accessibile?

Risposte:


220

Ho scoperto questo articolo , spiegando che a causa di un bug in Maven , il timestamp della build non viene propagato al filtro. La soluzione è racchiudere il timestamp in un'altra proprietà:

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>

Il filtro quindi funziona come previsto per

buildTimestamp=${timestamp}

1
Solo una nota per gli altri, ho avuto problemi con questo, perché sto usando Tomcat in Eclipse e sembra che non funzioni bene - la sostituzione è ok nella target/${project}cartella, ma nella mia configurazione attuale Tomcat non sta usando questa cartella ...
Betlista

3
@Betlista sì, l'integrazione del server in eclipse sembra utilizzare la directory di origine. È stato uno dei motivi per cui ho abbandonato l'integrazione di eclipse e ho utilizzato Maven dalla riga di comando.
kostja

1
Dato che ci sono più punti in un pom in cui ho bisogno di un timestamp, ma in diversi formati (ad esempio un nome di file e una stringa di tempo di costruzione), come posso utilizzare maven.build.timestamp.formatpiù volte?
Daniel Alder,

13
No worky. Il filtro sostituisce ${timestamp}con la stringa letterale ${maven.build.timestamp}.
Kevin Krumwiede

1
Se stai usando SpringBoot, devi scriverebuildTimestamp=@timestamp@
Julien Feniou

10

Posso confermare che Maven 3.x {maven.build.timestamp}"funziona" ora. A quanto pare hanno aggirato il problema. Non è più propertiesnecessaria alcuna soluzione alternativa.

Tuttavia, fai attenzione che il tuo plugin di "filtraggio" (maven-resources-plugin) sia aggiornato. Deve essere relativamente nuovo, quindi se mvn help:effective-pommostra una vecchia versione (es: 2.6), spostalo su qualcosa di più nuovo, aggiustalo per me, 3.x es:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
</plugin>

<properties><timestamp>... soluzione alternativa non è più necessaria ...

Questo ha anche chiarito, più o meno, perché funzionava in IntelliJ ma non nella riga di comando. IntelliJ probabilmente usa le proprie costanti Maven "modificate / interne", quindi funzionava lì, ma non dalla riga di comando Maven.

Nota anche se aggiungi una directory di risorse di filtraggio al tuo pom, potresti dover anche "aggiungere di nuovo" la directory predefinita, va persa, ad esempio:

  <resource>
    <directory>src/main/resources-filtered</directory> <!-- to get "maven.build.timestamp" into resource properties file -->
    <filtering>true</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory> <!-- apparently have to add this is you have the other... -->
  </resource>

NB se si sta utilizzando avvio di primavera, come un genitore, è necessario utilizzare @ @ maven.build.timestamp invece . Nota anche se stai usando lo spring boot, c'è un file META-INF/build-info.propertiesche è facoltativamente creato da spring-boot-maven-pluginche puoi leggere (spring fornisce un BuildPropertiesbean per comodità di leggerlo).


1
Sfortunatamente questo non funziona ancora per maven-war-plugin ( <webResources><resource><filtering>) :-( vedi MWAR-415 -> quindi devo ancora usare la soluzione alternativa lì
msa

1
Plugin diversi filtrano in modo diverso. Se utilizzi il filtro all'interno di maven-assembly-plugin v3.3.0, $ {maven.build.timestamp} non è ancora direttamente disponibile e devi utilizzare la <properties><timestamp>...soluzione alternativa. Vedi anche issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

Al fine di arricchire il contenuto di Stackoverflow per altri, che come me, hanno trovato questo post come un modo per risolvere il "problema" di ${maven.build.timestamp}. Questo non è un bug esperto, ma un comportamento previsto di m2e, come si può vedere in questo post .

Pertanto, credo che non ci si possa aspettare che la soluzione venga "corretta", poiché, da quanto ho capito, la correzione coinvolge questioni concettuali.

Nel mio caso, quello che ho fatto è stato utilizzare il plugin ( buildnumber-maven-plugin) come descritto in questo altro post .


Ho riscontrato buildnumber-maven-pluginproblemi simili, ovvero che la variabile che genera è disponibile solo in determinati contesti, NON filtrante. Potresti o meno essere in grado di superarlo armeggiando con la fase di esecuzione o gli obiettivi, ma la soluzione integrata sembra molto più semplice.
MarkHu

1

L'aggiunta di proprietà Maven a livello di progetto pom non tiene conto del fuso orario locale corretto, quindi il timestamp potrebbe apparire sbagliato:

<properties><timestamp>${maven.build.timestamp}</timestamp></properties>

L'utilizzo del plugin build-helper-maven applica il fuso orario corretto e l'ora legale corrente al timestamp:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.9.1</version>
            <executions>
                <execution>
                    <id>timestamp-property</id>
                    <goals>
                        <goal>timestamp-property</goal>
                    </goals>
                    <configuration>
                        <name>timestamp</name>
                        <pattern>yyyy-MM-dd HH:mm:ss</pattern>
                        <timeZone>Europe/Zurich</timeZone>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
         </resource>
     </resources>
 </build>

Durante il packaging, Maven sostituirà qualsiasi timestamp del token nella cartella / resources, ad es. Resources / version.properties:

build.timestamp = $ {timestamp}

È quindi possibile caricare questo file delle proprietà nella propria applicazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.