webentwicklung-frage-antwort-db.com.de

Zugriff auf maven.build.timestamp für die Ressourcenfilterung

Ich verwende Maven 3.0.4 und möchte den Build-Zeitstempel für meine Anwendung verfügbar machen. Dafür setze ich einen Platzhalter in eine .properties-Datei und lasse maven nach Build filtern. Während dies für ${project.version} gut funktioniert, wird ${maven.build.timestamp} beim Filtern nicht ersetzt. 

Die Eigenschaft scheint auf build verfügbar zu sein - ich kann sie verwenden, um den Artefaktnamen zu ändern: 

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

Warum steht es nicht für die Ressourcenfilterung zur Verfügung? Und was noch wichtiger ist, wie mache ich es zugänglich?

92
kostja

Ich habe diesen Artikel entdeckt und erklärt, dass aufgrund eines Fehlers in maven der Build-Zeitstempel nicht zur Filterung propagiert wird. Die Problemumgehung besteht darin, den Zeitstempel in eine andere Eigenschaft einzuhüllen:

<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}
194
kostja

Um den Stackoverflow-Inhalt für andere zu bereichern, fand dieser Beitrag eine Möglichkeit, das "Problem" von ${maven.build.timestamp} zu lösen. Dies ist kein großer Fehler, 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 Erachtens konzeptionelle Probleme beinhaltet.

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

2
Bob Rivers

Ich kann ab Maven 3.x bestätigen, dass {maven.build.timestamp} jetzt "arbeitet". Sie arbeiteten um das Problem anscheinend. Kein zusätzlicher properties 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-pom eine alte Version (Ex: 2.6) anzeigt, stelle es auf etwas neueres, fixiere es für mich, 3.x Ex:

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

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

Dies hat auch geklärt, warum es in IntelliJ funktioniert, aber nicht in der Befehlszeile. IntelliJ verwendet wahrscheinlich ihre eigenen "modifizierten/internen" Maven-Konstanten, sodass es dort arbeitete, jedoch nicht von der Maven-Befehlszeile aus.

Beachten Sie auch, wenn Sie ein Filterressourcenverzeichnis zu Ihrem pom hinzufügen. Möglicherweise müssen Sie auch das Standardverzeichnis "neu hinzufügen". 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>
1
rogerdpack

Beim Hinzufügen von Maven-Eigenschaften auf der Ebene des POM-Projekts wird die korrekte lokale Zeitzone nicht berücksichtigt, sodass der Zeitstempel möglicherweise falsch erscheint:

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

Mit dem Build-Helper-Maven-Plugin wird die richtige Zeitzone und 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 Verpacken ersetzt Maven jeden Token-Zeitstempel im/resources-Ordner, z. resources/version.properties:

build.timestamp = $ {timestamp}

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

0
skay