Modul Maven + Membangun Modul Tertentu Tunggal

384

Saya memiliki proyek Maven multi-modul dengan proyek induk Pdan tiga sub-modul A, Bdan C. Keduanya Bdan Cmerupakan proyek perang dan keduanya bergantung pada A.

Saya bisa mengetik mvn compiledi Pdan 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 Bdirektori, 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?

  1. Apakah saya harus menjalankan mvn packageseluruh hierarki proyek ketika saya benar-benar hanya ingin B?

  2. Apakah saya harus menginstal snapshot A ke dalam repositori lokal saya setiap kali saya ingin mengemas B?

Skenario kedua ini tidak terlalu menyenangkan ketika Amasih dalam pengembangan aktif.

Adakah praktik terbaik di sini?

Brian Ferris
sumber
kemungkinan duplikat modul Maven dan dependen
oberlies

Jawaban:

696

Adakah praktik terbaik di sini?

Gunakan opsi reaktor lanjutan Maven , lebih khusus:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Jadi cdmasuk ke direktori P induk dan jalankan:

mvn install -pl B -am

Dan ini akan membangun B dan modul yang dibutuhkan oleh B.

Perhatikan bahwa Anda perlu menggunakan titik dua jika Anda mereferensikan artifactIdyang berbeda dengan nama direktori:

mvn install -pl :B -am

Seperti dijelaskan di sini: https://stackoverflow.com/a/26439938/480894

Thivent Pascal
sumber
15
Bagi siapa saja yang memukul halaman ini pada tahun 2011, ini adalah jawaban yang lebih baik. Sekarang ada dukungan yang lebih baik untuk multi-modul dalam maven itu sendiri (Maven 2.1 dan di atas), Anda tidak perlu menggunakan plugin reaktor.
Spedge
17
Pilihan lain yang sangat berguna adalah "-amd, --also-make-dependents", yang membangun semua modul tergantung pada proyek-proyek dalam daftar reaktor.
deterb
1
Bagaimana dengan membangun modul cucu?
Bax
12
@ Bax, gunakan mvn install -pl .,parent/child,parent/child/grandchild Gunakan koma untuk memisahkan beberapa proyek dan. untuk parent pom
Neo
1
Ketika saya mencoba clean packagemodul dengan cara ini, ia tidak dapat menyelesaikan dependensi reaktor yang belum diinstal. Dengan -amitu tidak perlu membangun kembali deps.
baskom
18

Katakanlah Induk pom.xml berisi 6 modul dan Anda ingin menjalankan A , B dan F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd ke proyek induk

 mvn --projects A,B,F --also-make clean install

ATAU

mvn -pl A,B,F -am clean install

ATAU

mvn -pl A,B,F -amd clean install

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.

Waqas Ahmed
sumber
8

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 installin 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 installdalam proyek induk jika Anda memperbarui sebagian dari kode.

victor hugo
sumber
3
Ini akan menjadi mimpi buruk selama pengembangan, gambar yang sekali Anda perbaiki di sub modul, Anda harus menginstalnya, dan kemudian Anda memulai wadah servlet. Hidup ini singkat :(
hguser
7

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.

Penjual Kaya
sumber
1
Apakah ada cara mudah untuk menjamin bahwa semua proyek bergantung untuk proyek target saya telah diinstal? Hirarki yang saya miliki sebenarnya jauh lebih kompleks daripada yang dijelaskan di sini, jadi cobalah untuk mengingat apakah saya telah menjalankan mvn install untuk setiap proyek yang bergantung sejak saya terakhir membuat perubahan kode bisa rumit.
Brian Ferris
Ya, menggunakan modul untuk membangun set proyek, lihat tautan yang ditambahkan ke jawaban asli.
Penjual Kaya
5

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.

deterb
sumber
3
Ini dulunya jawaban yang tepat, tetapi dengan Maven 2.1 Anda tidak perlu lagi menggunakan plugin reaktor. Lihatlah jawaban Pascal di utas ini terkait dengan "Opsi Reaktor Lanjutan"
Spedge
3

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 -amatau -plbaris perintah seperti yang dijelaskan dalam jawaban yang diterima. Jika Anda menggunakan versi pakar sebelum v2.1, ubahlah itu terlebih dahulu :)

Zac Thompson
sumber
Grmphh ... maka saya akan berakhir dengan proyek agregator sebanyak proyek.
Kris
@ Kris Saya tidak akan merekomendasikan ini lagi. Saya akan meninggalkannya di sini kalau-kalau seseorang masih ingin tahu caranya, tapi saya selalu menggunakan flag -am dan -pl sekarang. Saya telah memperbarui jawaban saya.
Zac Thompson