Apa cara paling sederhana untuk mengambil nomor versi dari pom.xml maven dalam kode, yaitu, secara terprogram?
Dengan asumsi Anda menggunakan Java, Anda bisa
Buat .properties
file di (paling umum) src/main/resources
direktori Anda (tetapi pada langkah 4 Anda bisa mengatakannya untuk mencari di tempat lain).
Tetapkan nilai beberapa properti dalam .properties
file Anda menggunakan properti Maven standar untuk versi proyek: foo.bar=${project.version}
Dalam kode Java Anda, muat nilai dari file properti sebagai sumber daya dari classpath (google untuk contoh berlebihan tentang bagaimana melakukan ini, tapi di sini adalah contoh untuk pemula ).
Di Maven, aktifkan pemfilteran sumber daya - ini akan menyebabkan Maven menyalin file itu ke kelas output Anda dan menerjemahkan sumber daya selama salinan itu, menafsirkan properti. Anda dapat menemukan beberapa info di sini tetapi kebanyakan Anda hanya melakukan ini di pom Anda:
<bangun> <resources> <resource> <directory> src / main / resources </directory> <filtering> true </filtering> </resource> </resources> </build>
Anda juga bisa mendapatkan properti standar lain seperti project.name
,, project.description
atau bahkan properti sewenang-wenang yang Anda masukkan ke dalam pom <properties>
, dll. Pemfilteran sumber daya, dikombinasikan dengan profil Maven, dapat memberi Anda perilaku membangun variabel saat membangun. Saat Anda menentukan profil saat runtime dengan -PmyProfile
, itu dapat mengaktifkan properti yang kemudian dapat muncul di build Anda.
src/main/resources
, karena ini dapat memproses semua file yang terletak di direktori ini, termasuk file binari. Untuk menghindari perilaku tak terduga, lebih baik lakukan pemfilteran padasrc/main/resources-filtered
direktori, seperti yang disarankan di sini . Bagaimanapun, terima kasih atas trik yang bagus ini!Jawaban yang diterima mungkin merupakan cara terbaik dan paling stabil untuk memasukkan nomor versi ke aplikasi secara statis , tetapi tidak benar-benar menjawab pertanyaan awal: Bagaimana cara mengambil nomor versi artifact dari pom.xml? Jadi, saya ingin menawarkan alternatif yang menunjukkan bagaimana melakukannya secara dinamis selama runtime:
Anda bisa menggunakan Maven itu sendiri. Untuk lebih tepatnya, Anda bisa menggunakan perpustakaan Maven.
Dan kemudian lakukan sesuatu seperti ini di Jawa:
Log konsol adalah sebagai berikut:
Pembaruan 2017-10-31: Untuk menjawab pertanyaan tindak lanjut Simon Sobisch saya memodifikasi contoh seperti ini:
sumber
package
tabung normal (kelas dependensi tidak terintegrasi) dan tidak berfungsi ketika dikemas dengan maven-assembly-plugin yangjar-with-dependencies
saya dapatkan ajava.io.FileNotFoundException: pom.xml
(ada di dalam guci terakhir sebagaiMETA-INF/maven/my.package/myapp/pom.xml
) - ada petunjuk bagaimana mengatasi ini?Artefak terpaket berisi
META-INF/maven/${groupId}/${artifactId}/pom.properties
file yang kontennya seperti:Banyak aplikasi menggunakan file ini untuk membaca versi aplikasi / jar saat runtime, tidak ada pengaturan yang diperlukan.
Satu-satunya masalah dengan pendekatan di atas adalah bahwa file ini (saat ini) dihasilkan selama
package
fase dan dengan demikian tidak akan ada selama tes, dll (ada masalah Jira untuk mengubah ini, lihat MJAR-76 ). Jika ini merupakan masalah bagi Anda, maka pendekatan yang dijelaskan oleh Alex adalah cara yang harus dilakukan.sumber
Ada juga metode yang dijelaskan dalam Cara mudah untuk menampilkan nomor versi aplikasi Anda menggunakan Maven :
Tambahkan ini ke pom.xml
Kemudian gunakan ini:
Saya menemukan metode ini lebih sederhana.
sumber
getImplementationVersion()
itunull
. (maven versi 3.0.4).war
artefak, ingat untuk menggunakanmaven-war-plugin
bukannyamaven-jar-plugin
getImplementationVersion()
mengembalikan nol).Jika Anda menggunakan kemasan mvn seperti stoples atau perang, gunakan:
Bunyinya properti "Versi Implementasi" dari META-INF / MANIFEST.MF yang dihasilkan (yang disetel ke versi pom.xml) dalam arsip.
sumber
Untuk melengkapi apa yang telah diposting @kieste, yang menurut saya merupakan cara terbaik untuk membuat Maven membangun informasi yang tersedia dalam kode Anda jika Anda menggunakan Spring-boot: dokumentasi di http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info sangat berguna.
Anda hanya perlu mengaktifkan aktuator, dan menambahkan properti yang Anda butuhkan di
application.properties
atauapplication.yml
sumber
Gunakan Perpustakaan ini untuk kemudahan solusi sederhana. Tambahkan ke manifes apa pun yang Anda butuhkan lalu kueri dengan string.
http://manifests.jcabi.com/index.html
sumber
Kadang-kadang baris perintah Maven cukup ketika menulis sesuatu yang berkaitan dengan versi proyek, misalnya untuk pengambilan artifak melalui URL dari repositori:
Contoh penggunaan:
sumber
Dapatkan Versi menggunakan
this.getClass().getPackage().getImplementationVersion()
PS Jangan lupa menambahkan:
sumber
Dengan mengacu pada jawaban ketankk :
Sayangnya, menambahkan ini mengacaukan bagaimana aplikasi saya menangani sumber daya:
Tetapi dengan menggunakan tag <manifest> maven-assemble-plugin ini berhasil:
Jadi saya bisa mendapatkan versi menggunakan
sumber