Saya memiliki proyek Maven multi-modul dengan proyek induk P
dan tiga sub-modul A
, B
dan C
. Keduanya B
dan C
merupakan proyek perang dan keduanya bergantung pada A
.
Saya bisa mengetik mvn compile
di P
dan memiliki semua sub-modul benar dikompilasi. Masalahnya muncul ketika saya ingin melakukan operasi untuk modul tertentu.
Saya ingin dapat mengemas perang untuk proyek B
, tetapi ketika saya menjalankan perintah paket dari B
direktori, ia mengeluh bahwa ia tidak dapat menemukan dependensi untuk A
.
Saya mengerti dari pertanyaan ini: Modul Maven dan dependen yang mungkin Maven tidak benar-benar dirancang untuk jenis resolusi ketergantungan ini, tetapi itu menimbulkan pertanyaan tentang bagaimana saya mengemas B
?
Apakah saya harus menjalankan
mvn package
seluruh hierarki proyek ketika saya benar-benar hanya inginB
?Apakah saya harus menginstal snapshot A ke dalam repositori lokal saya setiap kali saya ingin mengemas
B
?
Skenario kedua ini tidak terlalu menyenangkan ketika A
masih dalam pengembangan aktif.
Adakah praktik terbaik di sini?
sumber
Jawaban:
Gunakan opsi reaktor lanjutan Maven , lebih khusus:
Jadi
cd
masuk ke direktori P induk dan jalankan:Dan ini akan membangun B dan modul yang dibutuhkan oleh B.
Perhatikan bahwa Anda perlu menggunakan titik dua jika Anda mereferensikan
artifactId
yang berbeda dengan nama direktori:Seperti dijelaskan di sini: https://stackoverflow.com/a/26439938/480894
sumber
mvn install -pl .,parent/child,parent/child/grandchild
Gunakan koma untuk memisahkan beberapa proyek dan. untuk parent pomclean package
modul dengan cara ini, ia tidak dapat menyelesaikan dependensi reaktor yang belum diinstal. Dengan-am
itu tidak perlu membangun kembali deps.Katakanlah Induk pom.xml berisi 6 modul dan Anda ingin menjalankan A , B dan F .
1- cd ke proyek induk
ATAU
ATAU
Catatan: Ketika Anda menentukan proyek dengan opsi -am , Maven akan membangun semua proyek yang bergantung pada proyek yang ditentukan (baik secara langsung atau tidak langsung). Maven akan memeriksa daftar proyek dan berjalan di pohon ketergantungan, menemukan semua proyek yang perlu dibangun.
Sementara perintah -am membuat semua proyek yang dibutuhkan oleh proyek tertentu dalam pembangunan multi-modul, opsi -amd atau --juga -buat-tanggungan mengonfigurasi Maven untuk membangun proyek dan proyek apa pun yang bergantung pada proyek itu. Saat menggunakan --juga membuat tanggungan , Maven akan memeriksa semua proyek di reaktor kami untuk menemukan proyek yang bergantung pada proyek tertentu. Secara otomatis akan membangun proyek-proyek itu dan tidak ada yang lain.
sumber
Maven benar-benar dirancang untuk jenis ketergantungan ini.
mvn package
tidak akan menginstal apa pun di repositori lokal Anda, hanya mengemas proyek dan membiarkannya di folder target.Do
mvn install
in parent project (A), dengan ini semua sub-modul akan diinstal di repositori Maven komputer Anda, jika tidak ada perubahan Anda hanya perlu mengkompilasi / mengemas sub-modul (B) dan Maven akan mengambil paket yang sudah dikemas dan dependensi yang diinstal tepat.Anda hanya perlu masuk ke
mvn install
dalam proyek induk jika Anda memperbarui sebagian dari kode.sumber
Jika sebelumnya Anda menjalankan mvn install pada proyek B, itu akan diinstal ke repositori lokal Anda, jadi ketika Anda membangun paket A Maven dapat menyelesaikan ketergantungannya. Jadi selama Anda menginstal proyek B setiap kali Anda mengubahnya, proyek Anda untuk proyek A akan diperbarui.
Anda dapat mendefinisikan proyek multi-modul dengan pom aggregator untuk membangun satu set proyek.
Ini juga bermanfaat menyebutkan m2eclipse , itu mengintegrasikan Maven ke Eclipse dan memungkinkan Anda untuk (opsional) menyelesaikan dependensi dari ruang kerja. Jadi jika Anda meretas banyak proyek, konten ruang kerja akan digunakan untuk kompilasi. Setelah Anda puas dengan perubahan Anda, jalankan mvn install (pada setiap proyek secara bergantian, atau gunakan agregator) untuk meletakkannya di repositori lokal Anda.
sumber
Lihatlah jawaban saya Maven dan modul dependen .
The Maven Reaktor Plugin ini dirancang untuk berurusan dengan membangun bagian dari proyek.
Tujuan khusus yang ingin Anda gunakan
reactor:make
.sumber
Anda mengatakan Anda "benar-benar hanya ingin B", tetapi ini salah. Anda ingin B, tetapi Anda juga ingin A yang diperbarui jika ada perubahan padanya ("pengembangan aktif").
Jadi, kadang-kadang Anda ingin bekerja dengan A, B, dan C. Untuk kasus ini Anda memiliki proyek agregator P. Untuk kasus di mana Anda ingin bekerja dengan A dan B (tetapi tidak ingin C), Anda harus membuat proyek agregator T .
Sunting 2016 : Informasi di atas mungkin relevan pada tahun 2009. Pada tahun 2016, saya sangat merekomendasikan mengabaikan ini dalam banyak kasus, dan hanya menggunakan bendera
-am
atau-pl
baris perintah seperti yang dijelaskan dalam jawaban yang diterima. Jika Anda menggunakan versi pakar sebelum v2.1, ubahlah itu terlebih dahulu :)sumber