Di Maven, dependensi biasanya diatur seperti ini:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Sekarang, jika Anda bekerja dengan perpustakaan yang memiliki rilis yang sering, memperbarui tag <version> secara terus-menerus bisa agak menjengkelkan. Apakah ada cara untuk memberitahu Maven untuk selalu menggunakan versi terbaru yang tersedia (dari repositori)?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
sumber
sumber
Jawaban:
CATATAN:
Jawaban ini hanya berlaku untuk Maven 2! Disebutkan
LATEST
danRELEASE
metaversions telah dijatuhkan di Maven 3 "demi membangun direproduksi" , lebih dari 6 tahun yang lalu. Silakan merujuk solusi yang sesuai Maven 3 ini .Jika Anda selalu ingin menggunakan versi terbaru, Maven memiliki dua kata kunci yang dapat Anda gunakan sebagai alternatif untuk rentang versi. Anda harus menggunakan opsi ini dengan hati-hati karena Anda tidak lagi mengontrol plugin / dependensi yang Anda gunakan.
Lihat bagian Sintaks POM dari buku Maven untuk lebih jelasnya. Atau lihat dokumen ini di Ranges Versi Ketergantungan , di mana:
[
&]
) berarti "tertutup" (inklusif).(
&)
) berarti "terbuka" (eksklusif).Berikut ini contoh yang menggambarkan berbagai opsi. Dalam repositori Maven, com.foo:my-foo memiliki metadata berikut:
Jika ketergantungan pada artifak itu diperlukan, Anda memiliki opsi berikut ( tentu saja rentang versi lain , hanya menunjukkan yang relevan di sini):
Nyatakan versi persisnya (akan selalu diselesaikan pada 1.0.1):
Nyatakan versi eksplisit (akan selalu diselesaikan pada 1.0.1 kecuali terjadi tabrakan, ketika Maven akan memilih versi yang cocok):
Nyatakan rentang versi untuk semua 1.x (saat ini akan diselesaikan ke 1.1.1):
Nyatakan rentang versi terbuka (akan beralih ke 2.0.0):
Deklarasikan versi sebagai TERBARU (akan menyelesaikan ke 2.0.0) (dihapus dari maven 3.x)
Deklarasikan versi sebagai RELEASE (akan menyelesaikan ke 1.1.1) (dihapus dari maven 3.x):
Perhatikan bahwa secara default penyebaran Anda sendiri akan memperbarui entri "terbaru" di metadata Maven, tetapi untuk memperbarui entri "rilis", Anda perlu mengaktifkan "profil rilis" dari MOM super POM . Anda dapat melakukan ini dengan "-Peluang-profil" atau "-DperformRelease = true"
Patut ditekankan bahwa pendekatan apa pun yang memungkinkan Maven untuk memilih versi dependensi (TERBARU, RELEASE, dan rentang versi) dapat membuat Anda terbuka untuk membuat masalah waktu, karena versi yang lebih baru dapat memiliki perilaku yang berbeda (misalnya plugin dependensi sebelumnya telah beralih ke default nilai dari benar ke salah, dengan hasil yang membingungkan).
Oleh karena itu umumnya merupakan ide yang baik untuk mendefinisikan versi yang tepat dalam rilis. Seperti yang ditunjukkan oleh jawaban Tim , plugin-versi-maven adalah alat yang berguna untuk memperbarui versi dependensi, terutama versi - versi: use-latest-versi dan versi: use-latest-rilis goal.
sumber
[1.1,2.0)
Sekarang saya tahu topik ini sudah lama, tetapi membaca pertanyaan dan jawaban yang diberikan OP sepertinya Plugin Versi Maven mungkin sebenarnya jawaban yang lebih baik untuk pertanyaannya:
Secara khusus, tujuan berikut dapat bermanfaat:
Tujuan lain berikut juga disediakan:
Hanya berpikir saya akan memasukkannya untuk referensi di masa depan.
sumber
Silakan lihat halaman ini (bagian "Rentang Versi Ketergantungan"). Apa yang mungkin ingin Anda lakukan adalah sesuatu seperti
Rentang versi ini diterapkan di Maven2.
sumber
mvn dependency:tree -Dverbose
cari tahu itu. Ini bisa menjelaskan versi yang tidak terduga.Tidak seperti yang lain, saya pikir ada banyak alasan mengapa Anda selalu ingin versi terbaru . Terutama jika Anda melakukan penyebaran berkelanjutan (kami terkadang memiliki 5 rilis dalam sehari) dan tidak ingin melakukan proyek multi-modul.
Apa yang saya lakukan adalah membuat Hudson / Jenkins melakukan hal berikut untuk setiap bangunan:
Itu saya menggunakan plugin versi dan scm plugin untuk memperbarui dependensi dan kemudian memeriksanya ke kontrol sumber. Ya saya membiarkan CI saya melakukan checkin SCM (yang harus Anda lakukan tetap untuk plugin rilis pakar).
Anda ingin mengatur plugin versi untuk hanya memperbarui apa yang Anda inginkan:
Saya menggunakan plugin rilis untuk melakukan rilis yang menangani -SNAPSHOT dan memvalidasi bahwa ada versi rilis -SNAPSHOT (yang penting).
Jika Anda melakukan apa yang saya lakukan, Anda akan mendapatkan versi terbaru untuk semua build snapshot dan versi rilis terbaru untuk build rilis. Bangunan Anda juga akan dapat direproduksi.
Memperbarui
Saya memperhatikan beberapa komentar yang menanyakan beberapa hal spesifik dari alur kerja ini. Saya akan mengatakan kita tidak menggunakan metode ini lagi dan alasan utama mengapa plugin versi pakar adalah buggy dan secara umum cacat secara inheren.
Itu cacat karena untuk menjalankan plugin versi untuk menyesuaikan versi semua versi yang ada perlu ada agar pom dapat berjalan dengan benar. Itu adalah plugin versi tidak dapat memperbarui ke versi terbaru apa pun jika tidak menemukan versi yang direferensikan di pom. Ini sebenarnya agak mengganggu karena kita sering membersihkan versi lama karena alasan ruang disk.
Benar-benar Anda memerlukan alat terpisah dari pakar untuk menyesuaikan versi (sehingga Anda tidak bergantung pada file pom untuk berjalan dengan benar). Saya telah menulis alat seperti itu dalam bahasa rendahan yaitu Bash. Script akan memperbarui versi seperti plugin versi dan memeriksa pom kembali ke kontrol sumber. Ini juga berjalan seperti 100x lebih cepat daripada plugin versi mvn. Sayangnya itu tidak ditulis untuk penggunaan umum tetapi jika orang tertarik saya bisa membuatnya dan meletakkannya di intisari atau github.
Kembali ke alur kerja ketika beberapa komentar bertanya tentang apa yang kami lakukan:
Pada titik ini saya berpendapat itu adalah hal yang baik untuk memiliki rilis dan versi otomatis alat terpisah dari build umum Anda.
Sekarang Anda mungkin berpikir maven agak menyebalkan karena masalah yang tercantum di atas tetapi ini sebenarnya akan cukup sulit dengan alat build yang tidak memiliki deklaratif yang mudah untuk menguraikan sintaks yang dapat diperpanjang (alias XML).
Sebenarnya kami menambahkan atribut XML khusus melalui ruang nama untuk membantu memberi petunjuk skrip bash / groovy (mis. Jangan perbarui versi ini).
sumber
Sintaks dependensi terletak di dokumentasi Spesifikasi Persyaratan Versi Dependensi . Ini dia untuk kelengkapan:
Dalam kasus Anda, Anda bisa melakukan sesuatu seperti
<version>[1.2.3,)</version>
sumber
Apakah Anda mungkin bergantung pada versi pengembangan yang jelas banyak berubah selama pengembangan?
Alih-alih menambah versi rilis pengembangan, Anda bisa menggunakan versi snapshot yang Anda timpa saat diperlukan, yang berarti Anda tidak perlu mengubah tag versi pada setiap perubahan kecil. Sesuatu seperti 1.0-SNAPSHOT ...
Tetapi mungkin Anda mencoba mencapai sesuatu yang lain;)
sumber
Siapa yang pernah menggunakan TERBARU, pastikan Anda memiliki -U kalau tidak, snapshot terbaru tidak akan ditarik.
sumber
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Pada saat pertanyaan ini diajukan, ada beberapa kekusutan dengan rentang versi di pakar, tetapi ini telah diselesaikan di versi pakar yang lebih baru. Artikel ini menangkap dengan sangat baik bagaimana rentang versi bekerja dan praktik terbaik untuk lebih memahami bagaimana maven memahami versi: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
sumber
Kebenarannya bahkan dalam 3.x masih berfungsi, secara mengejutkan proyek tersebut dibangun dan digunakan. Tetapi kata kunci TERBARU / RELEASE menyebabkan masalah dalam m2e dan gerhana di semua tempat, proyek JUGA tergantung pada ketergantungan yang digunakan melalui TERBARU / RELEASE gagal mengenali versi.
Ini juga akan menimbulkan masalah jika Anda mencoba mendefinisikan versi sebagai properti, dan merujuknya di tempat lain.
Jadi kesimpulannya adalah menggunakan versi-maven-plugin jika Anda bisa.
sumber
Kadang-kadang Anda tidak ingin menggunakan rentang versi, karena tampaknya mereka "lambat" untuk menyelesaikan dependensi Anda, terutama ketika ada pengiriman terus menerus di tempat dan ada banyak versi - terutama selama pengembangan yang berat.
Salah satu solusinya adalah dengan menggunakan versi-maven-plugin . Misalnya, Anda dapat mendeklarasikan properti:
dan tambahkan versi-maven-plugin ke file pom Anda:
Kemudian, untuk memperbarui ketergantungan, Anda harus menjalankan tujuan:
Jika ada versi yang lebih baru dari 1.1.1, itu akan memberi tahu Anda:
sumber
Jika Anda ingin Maven harus menggunakan versi terbaru dari dependensi, maka Anda dapat menggunakan Plugin Version Maven dan cara menggunakan plugin ini, Tim telah memberikan jawaban yang baik, ikuti jawabannya .
Tetapi sebagai pengembang, saya tidak akan merekomendasikan praktik seperti ini. MENGAPA?
jawaban mengapa sudah diberikan oleh Pascal Thivent dalam komentar pertanyaan
Saya akan merekomendasikan jenis latihan ini:
mudah dirawat dan mudah di-debug. Anda dapat memperbarui POM Anda dalam waktu singkat.
sumber
Solusi MY di pakar 3.5.4, gunakan nexus, dalam gerhana:
lalu di eclipse:,
atl + F5
dan pilihforce update of snapshots/release
ini bekerja untuk saya.
sumber