Kaynak filtreleme için maven.build.timestamp'a nasıl erişilir


107

Maven 3.0.4 kullanıyorum ve derleme zaman damgasını uygulamam için erişilebilir hale getirmek istiyorum. Bunun için, bir .propertiesdosyaya bir yer tutucu koyuyorum ve derlemede maven filtrelemesine izin veriyorum . Bunun için iyi çalışıyor iken ${project.version}, ${maven.build.timestamp}filtreleme üzerine ikame edilmez.

Özellik, yapıda mevcut görünüyor - yapı adını değiştirmek için kullanabilirim:

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

Öyleyse neden kaynak filtreleme için mevcut değil? Ve daha da önemlisi, onu nasıl erişilebilir hale getirebilirim?

Yanıtlar:


220

Bu makaleyi keşfettim ve maven'deki bir hata nedeniyle derleme zaman damgasının filtrelemeye yayılmadığını açıkladım. Çözüm, zaman damgasını başka bir özelliğe kaydırmaktır:

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

Filtreleme daha sonra beklendiği gibi çalışır

buildTimestamp=${timestamp}

1
Sadece diğerleri için bir not, bununla ilgili sorun yaşadım, çünkü Eclipse içinde Tomcat kullanıyorum ve öyle görünüyor ki, iyi çalışmıyor - target/${project}klasörde değiştirme tamam , ancak gerçek yapılandırmamda Tomcat bu klasörü kullanmıyor ...
Betlista 13

3
@Betlista evet, tutulmadaki sunucu entegrasyonu kaynak dizini kullanıyor gibi görünüyor. Tutulma entegrasyonunu bırakmamın ve komut satırından maven kullanmamın nedenlerinden biri buydu.
kostja

1
Bir pomda bir zaman damgasına ihtiyaç duyduğum birden fazla yer olduğu, ancak farklı biçimlerde (örneğin bir dosya adı ve bir oluşturma zamanı dizesi) olduğu göz önüne alındığında, nasıl maven.build.timestamp.formatbirden çok kez kullanabilirim ?
Daniel Alder

13
İş yok. Filtreleme ${timestamp}, değişmez dizeyle değiştirilir ${maven.build.timestamp}.
Kevin Krumwiede

1
buildTimestamp=@timestamp@
SpringBoot

10

Maven 3.x'in {maven.build.timestamp}şu anda "çalıştığını" doğrulayabilirim . Onlar arounded çalışır görünüşe göre, sorunu. Artık ek propertiesgeçici çözüme gerek yok.

Ancak, "filtreleme" eklentinizin (maven-kaynaklar-eklentisi) güncel olmasına dikkat edin. Nispeten yeni olması gerekir, bu nedenle mvn help:effective-pomeski bir sürümü gösterirse (ör: 2.6), onu daha yeni bir şeye çarpın, benim için düzeltin, 3.x ex:

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

<properties><timestamp>... geçici çözüm artık gerekli değil ...

Bu aynı zamanda neden IntelliJ'de çalıştığını ama komut satırında çalışmadığını da açıklığa kavuşturdu. IntelliJ muhtemelen kendi "değiştirilmiş / dahili" maven sabitlerini kullanır, bu yüzden orada çalışıyordu, ancak maven komut satırından değil.

Ayrıca, pom'a bir filtreleme kaynağı dizini eklerseniz, varsayılan dizini de "yeniden eklemeniz" gerekebileceğini unutmayın; kaybolur, örn:

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

Dikkat: Spring boot'u ebeveyniniz olarak kullanıyorsanız, bunun yerine @ maven.build.timestamp @ kullanmanız gerekir . Ayrıca, yaylı önyükleme kullanıyorsanız META-INF/build-info.properties, isteğe bağlı olarak okuyabileceğiniz bir dosya spring-boot-maven-pluginolduğunu unutmayın (yay, okumayı kolaylaştırmak için bir fasulye sağlar ).BuildProperties


1
Ne yazık ki bu henüz maven-war-plugin ( <webResources><resource><filtering>) için çalışmıyor :-( MWAR-415'e bakın -> bu yüzden hala geçici çözümü kullanmak zorundasınız
msa

1
Farklı eklentiler farklı filtreleme yapar. Maven-assembly-plugin v3.3.0 içinde filtreleme kullanırsanız, $ {maven.build.timestamp} hala doğrudan kullanılamaz ve <properties><timestamp>...geçici çözümü kullanmanız gerekir . Ayrıca bkz. İssues.apache.org
jira/

4

Stackoverflow içeriğini benim gibi başkaları için zenginleştirmek amacıyla, bu yazıyı "problemini" çözmenin bir yolu olarak buldu ${maven.build.timestamp}. Bu maven hata değil, M2e beklenen davranış olarak görülebilir bu yazı .

Bu nedenle, anladığım kadarıyla, düzeltmenin kavramsal sorunları içerdiğinden, çözümün "düzeltilmesini" bekleyemeyeceğimize inanıyorum.

Benim durumumda, yaptığım şey buildnumber-maven-pluginbu diğer yazıda açıklandığı gibi eklentiyi ( ) kullanmaktı .


buildnumber-maven-pluginBenzer problemler buldum , yani ürettiği değişkenin filtreleme DEĞİL, sadece belirli bağlamlarda mevcut olduğunu. Yürütme aşaması veya hedeflerle uğraşarak bunun üstesinden gelebilir veya gelemeyebilirsiniz, ancak yerleşik çözüm çok daha basit görünüyor.
MarkHu

1

Pom proje düzeyinde Maven mülkleri eklemek, doğru yerel Saat Dilimini hesaba katmaz, bu nedenle zaman damgası yanlış görünebilir:

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

Build-helper-maven-eklentisini kullanmak, doğru zaman dilimini ve mevcut gün ışığından yararlanma saatini zaman damgasına uygular:

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

Paketleme sırasında Maven, / kaynaklar klasöründeki herhangi bir simge zaman damgasını değiştirir, örneğin kaynaklar / sürüm.properties:

build.timestamp = $ {timestamp}

Daha sonra bu özellikler dosyasını Uygulamanıza yükleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.