Jak uzyskać dostęp do maven.build.timestamp w celu filtrowania zasobów

107

Używam maven 3.0.4 i chcę, aby sygnatura czasowa kompilacji była dostępna dla mojej aplikacji. W tym celu umieszczam element zastępczy w .propertiespliku i pozwalam mavenowi filtrować podczas kompilacji. Chociaż działa to dobrze ${project.version}, ${maven.build.timestamp}nie jest zastępowane filtrowaniem.

Właściwość wydaje się być dostępna w kompilacji - mogę jej użyć do zmodyfikowania nazwy artefaktu:

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

Dlaczego więc nie jest dostępne do filtrowania zasobów? A co ważniejsze, jak mogę to zrobić?

kostja
źródło

Odpowiedzi:

220

Odkryłem ten artykuł , wyjaśniając, że z powodu błędu w maven znacznik czasu kompilacji nie jest propagowany do filtrowania. Sposób obejścia problemu polega na umieszczeniu sygnatury czasowej w innej właściwości:

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

Filtrowanie działa wtedy zgodnie z oczekiwaniami

buildTimestamp=${timestamp}
kostja
źródło
1
Jeszcze uwaga dla innych, miałem z tym problem, bo używam Tomcata w Eclipse i wygląda na to, że nie działa - wymiana jest w porządku w target/${project}folderze, ale w mojej obecnej konfiguracji Tomcat nie używa tego folderu ...
Betlista
3
@Betlista tak, integracja serwera w eclipse wydaje się używać katalogu źródłowego. To był jeden z powodów, dla których porzuciłem integrację eclipse i użyłem maven z linii poleceń.
kostja
1
Biorąc pod uwagę, że w pomie jest wiele miejsc, w których potrzebuję znacznika czasu, ale w różnych formatach (na przykład nazwa pliku i ciąg czasu kompilacji), jak mogę użyć maven.build.timestamp.formatwiele razy?
Daniel Alder
13
Nie działa. Filtrowanie zastępuje ${timestamp}ciąg literału ${maven.build.timestamp}.
Kevin Krumwiede
1
Jeśli używasz SpringBoot, musisz napisaćbuildTimestamp=@timestamp@
Julien Feniou
10

Mogę potwierdzić, że Maven 3.x {maven.build.timestamp}działa teraz. Oni pracują arounded problemu, widocznie. Żadne dodatkowe propertiesobejście nie jest już potrzebne.

Uważaj jednak, aby Twoja wtyczka filtrująca (maven-resources-plugin) była aktualna. Musi być stosunkowo nowy, więc jeśli mvn help:effective-pompokazuje starą wersję (np: 2.6), podbij ją na coś nowszego, naprawiłem to dla mnie, 3.x ex:

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

<properties><timestamp>... obejście nie jest już wymagane ...

To również wyjaśniło, w pewnym sensie, dlaczego działa w IntelliJ, ale nie w linii poleceń. IntelliJ prawdopodobnie używa swoich własnych "zmodyfikowanych / wewnętrznych" stałych maven, więc tam działał, ale nie z wiersza poleceń mavena.

Zwróć też uwagę, że jeśli dodasz filtrowanie katalogu zasobów do swojego pom, może być konieczne „ponowne dodanie” katalogu domyślnego, zostanie on utracony, np.

  <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, jeśli używasz spring boot jako swojego rodzica, musisz zamiast tego użyć @ maven.build.timestamp @ . Zauważ również, że jeśli używasz rozruchu sprężynowego, istnieje plik, META-INF/build-info.propertiesktóry jest opcjonalnie tworzony przez ten spring-boot-maven-plugin, który możesz przeczytać (wiosna zapewnia BuildPropertiesfasolkę dla wygody czytania).

rogerdpack
źródło
1
Niestety to jeszcze nie działa dla maven-war-plugin ( <webResources><resource><filtering>) :-( patrz MWAR-415 -> więc nadal muszę tam zastosować obejście
msa
1
Różne wtyczki inaczej filtrują. Jeśli używasz filtrowania we wtyczce maven-assembly-plugin w wersji 3.3.0, $ {maven.build.timestamp} nadal nie jest bezpośrednio dostępny i musisz zastosować <properties><timestamp>...obejście. Zobacz też Issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Aby wzbogacić zawartość Stackoverflow dla innych, którzy tak jak ja, znaleźli ten post jako sposób na rozwiązanie „problemu” ${maven.build.timestamp}. To nie jest błąd maven, ale oczekiwane zachowanie m2e, jak widać w tym poście .

Dlatego uważam, że nie możemy oczekiwać, że rozwiązanie zostanie „poprawione”, ponieważ z tego, co rozumiem, korekta wiąże się z kwestiami koncepcyjnymi.

W moim przypadku użyłem wtyczki ( buildnumber-maven-plugin), jak opisano w tym innym poście .

Bob Rivers
źródło
Odkryłem, że buildnumber-maven-pluginmam podobne problemy, a mianowicie, że zmienna, którą generuje, jest dostępna tylko w określonych kontekstach, a NIE filtruje. Możesz to przezwyciężyć lub nie, majstrując przy fazie realizacji lub celach, ale wbudowane rozwiązanie wydaje się o wiele prostsze.
MarkHu
1

Dodanie właściwości Mavena na poziomie projektu pom nie uwzględnia poprawnej lokalnej strefy czasowej, więc sygnatura czasowa może wyglądać nieprawidłowo:

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

Użycie wtyczki build-helper-maven-plugin powoduje zastosowanie poprawnej strefy czasowej i bieżącego czasu letniego do sygnatury czasowej:

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

Podczas pakowania Maven zastąpi dowolny znacznik czasu tokena w folderze / resources, np. Resources / version.properties:

build.timestamp = $ {timestamp}

Następnie możesz załadować ten plik właściwości do aplikacji.

skay
źródło