So greifen Sie auf maven.build.timestamp zu, um Ressourcen zu filtern

107

Ich verwende Maven 3.0.4 und möchte den Build-Zeitstempel für meine Anwendung zugänglich machen. Dazu .propertiesfüge ich einen Platzhalter in eine Datei ein und lasse Maven beim Erstellen filtern. Während dies gut funktioniert ${project.version}, ${maven.build.timestamp}wird es beim Filtern nicht ersetzt.

Die Eigenschaft scheint beim Erstellen verfügbar zu sein - ich kann sie verwenden, um den Namen des Artefakts zu ändern:

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

Warum ist es nicht für die Ressourcenfilterung verfügbar? Und was noch wichtiger ist: Wie mache ich es zugänglich?

kostja
quelle

Antworten:

220

Ich habe diesen Artikel entdeckt und erklärt, dass aufgrund eines Fehlers in maven der Build-Zeitstempel nicht an die Filterung weitergegeben wird. Die Problemumgehung besteht darin, den Zeitstempel in eine andere Eigenschaft zu verpacken:

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

Die Filterung funktioniert dann wie erwartet

buildTimestamp=${timestamp}
kostja
quelle
1
Nur eine Anmerkung für andere, ich hatte ein Problem damit, weil ich Tomcat in Eclipse verwende und es anscheinend nicht gut funktioniert - das Ersetzen ist im target/${project}Ordner in Ordnung, aber in meiner tatsächlichen Konfiguration verwendet Tomcat diesen Ordner nicht ...
Betlista
3
@ Betlista Ja, die Serverintegration in Eclipse scheint das Quellverzeichnis zu verwenden. Dies war einer der Gründe, warum ich die Eclipse-Integration aufgegeben und Maven über die Befehlszeile verwendet habe.
Kostja
1
Wie kann ich mehrere Stellen in einem POM verwenden, wenn ich einen Zeitstempel benötige, aber in verschiedenen Formaten (z. B. einem Dateinamen und einer Build-Zeitzeichenfolge) maven.build.timestamp.format?
Daniel Alder
13
Kein Worky. Das Filtern wird ${timestamp}durch die Literalzeichenfolge ersetzt ${maven.build.timestamp}.
Kevin Krumwiede
1
Wenn Sie SpringBoot verwenden, müssen Sie schreibenbuildTimestamp=@timestamp@
Julien Feniou
10

Ich kann bestätigen, dass Maven 3.x {maven.build.timestamp}jetzt "funktioniert". Sie arbeiten arounded das Problem offenbar. Es ist keine zusätzliche propertiesProblemumgehung mehr erforderlich.

Seien Sie jedoch vorsichtig, dass Ihr "Filter" -Plugin (Maven-Resources-Plugin) auf dem neuesten Stand ist. Es muss relativ neu sein. Wenn also mvn help:effective-pomeine alte Version (z. B. 2.6) angezeigt wird, stoßen Sie sie auf etwas Neueres, beheben Sie sie für mich. 3.x z.

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

<properties><timestamp>... Problemumgehung ist nicht mehr erforderlich ...

Dies klärte auch irgendwie auf, warum es in IntelliJ funktionierte, aber nicht in der Kommandozeile. IntelliJ verwendet wahrscheinlich ihre eigenen "modifizierten / internen" Maven-Konstanten, also funktionierte es dort, aber nicht über die Maven-Befehlszeile.

Beachten Sie auch, dass Sie beim Hinzufügen eines Filterressourcenverzeichnisses zu Ihrem POM möglicherweise auch das Standardverzeichnis "erneut hinzufügen" müssen. Es geht verloren, z.

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

Hinweis: Wenn Sie Spring Boot als übergeordnetes Element verwenden, müssen Sie stattdessen @ maven.build.timestamp @ verwenden . Beachten Sie auch, dass bei Verwendung von Spring Boot eine Datei META-INF/build-info.propertiesoptional von der Datei erstellt wird, die spring-boot-maven-pluginSie lesen können (Spring bietet eine BuildPropertiesBean zum bequemen Lesen).

Rogerdpack
quelle
1
Leider funktioniert dies für maven-war-plugin ( <webResources><resource><filtering>) noch nicht :-( siehe MWAR-415 -> muss also noch die Problemumgehung dort verwenden
msa
1
Verschiedene Plugins filtern unterschiedlich. Wenn Sie die Filterung im Maven-Assembly-Plugin v3.3.0 verwenden, ist der $ {maven.build.timestamp} immer noch nicht direkt verfügbar, und Sie müssen die <properties><timestamp>...Problemumgehung verwenden. Siehe auch issue.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Um den Stackoverflow-Inhalt für andere zu bereichern, fand dieser Beitrag wie ich einen Weg, um das "Problem" von zu lösen ${maven.build.timestamp}. Dies ist kein Maven-Bug, sondern ein erwartetes Verhalten von m2e, wie in diesem Beitrag zu sehen ist .

Daher glaube ich, dass wir nicht erwarten können, dass die Lösung "korrigiert" wird, da die Korrektur meines Wissens konzeptionelle Probleme mit sich bringt.

In meinem Fall habe ich das Plugin ( buildnumber-maven-plugin) verwendet, wie in diesem anderen Beitrag beschrieben .

Bob Rivers
quelle
Ich buildnumber-maven-pluginhabe ähnliche Probleme festgestellt , nämlich dass die Variable, die sie generiert, nur in bestimmten Kontexten verfügbar ist und NICHT gefiltert wird. Möglicherweise können Sie dies überwinden, indem Sie an der Ausführungsphase oder den Ausführungszielen basteln, aber die integrierte Lösung scheint viel einfacher zu sein.
MarkHu
1

Das Hinzufügen von Maven-Eigenschaften auf POM-Projektebene berücksichtigt nicht die korrekte lokale Zeitzone, sodass der Zeitstempel möglicherweise falsch erscheint:

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

Mit dem Build-Helper-Maven-Plugin werden die richtige Zeitzone und die aktuelle Sommerzeit auf den Zeitstempel angewendet:

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

Beim Packen ersetzt Maven alle Token-Zeitstempel im Ordner / resources, z. B. resources / version.properties:

build.timestamp = $ {timestamp}

Sie können diese Eigenschaftendatei dann in Ihre Anwendung laden.

Skay
quelle