Cara mengakses maven.build.timestamp untuk pemfilteran resource

107

Saya menggunakan maven 3.0.4 dan ingin membuat cap waktu build dapat diakses oleh aplikasi saya. Untuk ini, saya meletakkan placeholder di .propertiesfile dan membiarkan maven memfilter pada build. Meskipun ini berfungsi dengan baik ${project.version}, ${maven.build.timestamp}tidak diganti dengan penyaringan.

Properti tampaknya tersedia saat dibangun - saya dapat menggunakannya untuk mengubah nama artefak:

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

Jadi mengapa itu tidak tersedia untuk pemfilteran sumber daya? Dan, yang lebih penting, bagaimana cara membuatnya dapat diakses?

kostja
sumber

Jawaban:

220

Saya telah menemukan artikel ini , menjelaskan bahwa karena bug di maven , cap waktu build tidak disebarkan ke pemfilteran. Solusinya adalah dengan menggabungkan stempel waktu di properti lain:

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

Pemfilteran kemudian berfungsi seperti yang diharapkan

buildTimestamp=${timestamp}
kostja
sumber
1
Sekadar catatan untuk yang lain, saya mengalami masalah dengan itu, karena saya menggunakan Tomcat di dalam Eclipse dan tampaknya, itu tidak berfungsi dengan baik - penggantian tidak masalah di target/${project}folder, tetapi dalam konfigurasi aktual saya Tomcat tidak menggunakan folder ini ...
Betlista
3
@Betlista ya, integrasi server di eclipse sepertinya menggunakan direktori sumber. Itu adalah salah satu alasan mengapa saya meninggalkan integrasi gerhana dan menggunakan maven dari baris perintah.
kostja
1
Mengingat ada beberapa tempat di pom di mana saya memerlukan stempel waktu, tetapi dalam format yang berbeda (misalnya nama file dan string waktu pembuatan), bagaimana saya bisa menggunakan maven.build.timestamp.formatbeberapa kali?
Daniel Alder
13
Tidak bekerja. Pemfilteran diganti ${timestamp}dengan string literal ${maven.build.timestamp}.
Kevin Krumwiede
1
Jika Anda menggunakan SpringBoot, Anda harus menulisbuildTimestamp=@timestamp@
Julien Feniou
10

Saya dapat mengonfirmasi pada Maven 3.x {maven.build.timestamp} "bekerja" sekarang. Mereka bekerja arounded masalah, rupanya. Tidak ada tambahanproperties perlu solusi lagi.

Namun, hati-hati plugin "filtering" Anda (maven-resources-plugin) adalah yang terbaru. Ini perlu relatif baru, jadi jikamvn help:effective-pom menunjukkan versi lama (mis .: 2.6), ubah ke sesuatu yang lebih baru, perbaiki untuk saya, 3.x ex:

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

<properties><timestamp>... solusi tidak lagi diperlukan ...

Ini juga menjelaskan, mengapa itu berfungsi di IntelliJ tetapi tidak di baris perintah. IntelliJ mungkin menggunakan konstanta maven "diubah / internal" mereka sendiri, jadi IntelliJ berfungsi di sana, tetapi tidak dari baris perintah maven.

Perhatikan juga jika Anda menambahkan direktori resource pemfilteran ke you pom, Anda mungkin juga perlu "menambahkan kembali" direktori default, direktori tersebut akan hilang, misalnya:

  <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 jika Anda menggunakan boot musim semi sebagai orang tua, Anda harus menggunakan @ maven.build.timestamp @ sebagai gantinya . Juga perhatikan jika Anda menggunakan boot musim semi ada file META-INF/build-info.propertiesyang secara opsional dibuat oleh spring-boot-maven-pluginyang dapat Anda baca (musim semi menyediakan BuildPropertieskacang untuk kenyamanan membacanya).

rogerdpack
sumber
1
Sayangnya ini belum berfungsi untuk maven-war-plugin ( <webResources><resource><filtering>) :-( lihat MWAR-415 -> jadi masih harus menggunakan solusi di sana
msa
1
Plugin yang berbeda melakukan penyaringan secara berbeda. Jika Anda menggunakan pemfilteran dalam maven-assembly-plugin v3.3.0, $ {maven.build.timestamp} masih tidak tersedia secara langsung, dan Anda perlu menggunakan <properties><timestamp>...solusi alternatif. Lihat juga issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Untuk memperkaya konten Stackoverflow bagi orang lain, yang seperti saya, menemukan posting ini sebagai cara untuk memecahkan "masalah" dari ${maven.build.timestamp}. Ini bukan bug maven, tapi perilaku m2e yang diharapkan, seperti yang bisa dilihat di posting ini .

Oleh karena itu, saya percaya bahwa kita tidak dapat mengharapkan solusi untuk "dikoreksi", karena dari apa yang saya pahami, koreksi melibatkan masalah konseptual.

Dalam kasus saya, yang saya lakukan adalah menggunakan plugin ( buildnumber-maven-plugin) seperti yang dijelaskan di posting lain ini .

Bob Rivers
sumber
Saya menemukan buildnumber-maven-pluginmasalah serupa, yaitu variabel yang dihasilkannya hanya tersedia dalam konteks tertentu, BUKAN pemfilteran. Anda mungkin atau mungkin tidak dapat mengatasinya dengan mengutak-atik fase atau tujuan eksekusi, tetapi solusi bawaan tampaknya jauh lebih sederhana.
MarkHu
1

Menambahkan properti Maven di level project pom tidak memperhitungkan Zona Waktu lokal yang benar, sehingga stempel waktu mungkin terlihat salah:

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

Menggunakan build-helper-maven-plugin menerapkan zona waktu yang benar dan waktu musim panas saat ini ke stempel waktu:

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

Saat memaketkan, Maven akan mengganti stempel waktu token apa pun di folder / resource, misalnya resource / version.properties:

build.timestamp = $ {timestamp}

Anda kemudian dapat memuat file properti ini di Aplikasi Anda.

skay
sumber