Apa perbedaan antara dependencyManagement
dan dependencies
? Saya telah melihat dokumen di situs web Apache Maven. Tampaknya ketergantungan yang ditentukan di bawah dependencyManagement
dapat digunakan dalam modul turunannya tanpa menentukan versi.
Sebagai contoh:
Proyek induk (Pro-par) mendefinisikan ketergantungan di bawah dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
Kemudian pada anak Pro-par, saya dapat menggunakan junit:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
Namun, saya bertanya-tanya apakah perlu mendefinisikan junit di pom induk? Mengapa tidak mendefinisikannya langsung di modul yang dibutuhkan?
sumber
<dependencyManagement>
dalam POM induk. Menutupi dependensi dalam<dependencyManagement>
manajemen versi, ruang lingkup, dan pengecualian yang terpusat untuk setiap dependensi, jika dan ketika Anda memutuskan untuk menggunakannya. Panduan Maven untuk manajemen ketergantungan masuk ke semua detail.dependencyManagement
juga mengontrol dependensi transitif) hanya benar ketika dependensi diatur secara eksplisit: stackoverflow.com/questions/28312975/…dependencies
bagian baru di pom orang tua Anda. Kami melakukan itu sehingga semua proyek anak memiliki beberapa apache-commons secara default dan tidak menyatakannya sepanjang waktu.Saya sangat terlambat untuk pertanyaan ini, tetapi saya pikir itu layak respon yang lebih jelas daripada yang diterima (yang benar, tetapi tidak menekankan bagian penting yang sebenarnya, yang perlu Anda simpulkan sendiri).
Di POM induk, perbedaan utama antara
<dependencies>
dan<dependencyManagement>
adalah:Artefak yang ditentukan dalam
<dependencies>
bagian ini SELALU akan dimasukkan sebagai ketergantungan modul anak.Artefak yang ditentukan dalam
<dependencyManagement>
bagian, hanya akan dimasukkan dalam modul anak jika mereka juga ditentukan dalam<dependencies>
bagian dari modul anak itu sendiri. Mengapa ada baiknya Anda bertanya? karena Anda menentukan versi dan / atau ruang lingkup di induknya, dan Anda dapat mengabaikannya ketika menentukan dependensi dalam POM anak. Ini dapat membantu Anda menggunakan versi terpadu untuk dependensi untuk modul anak, tanpa menentukan versi di setiap modul anak.sumber
<dependencyManagement>
lebih<dependencies>
dalam akar.pom
? Anakpom
bisa jauh lebih pendek.Artifacts specified in the <dependencies> section will ALWAYS be included as a dependency of the child module(s)
bahwa mereka termasuk dalam orangtua juga. Tampaknya tidak mungkin untuk menetapkan ketergantungan untuk anak-anak, tetapi tidak untuk orang tua.The dokumentasi di situs Maven mengerikan. Apa yang dilakukan dependencyManagement hanyalah memindahkan definisi dependensi Anda (versi, pengecualian, dll) ke pom induk, kemudian di pom anak Anda hanya perlu meletakkan groupId dan artifactId. Itu saja (kecuali untuk rantai pom induk dan sejenisnya, tapi itu tidak terlalu rumit juga - dependensiManajemen menang atas ketergantungan pada tingkat induk - tetapi jika memiliki pertanyaan tentang itu atau impor, dokumentasi Maven sedikit lebih baik).
Setelah membaca semua sampah 'a', 'b', 'c' di situs Maven dan menjadi bingung, saya menulis ulang contoh mereka. Jadi jika Anda memiliki 2 proyek (proj1 dan proj2) yang memiliki ketergantungan yang sama (betaShared), Anda dapat memindahkan ketergantungan itu ke pom induk. Ketika Anda berada di sana, Anda juga dapat naik ke dependensi lain (alpha dan charlie) tetapi hanya jika masuk akal untuk proyek Anda. Jadi untuk situasi yang dijabarkan dalam kalimat sebelumnya, berikut adalah solusinya dengan dependensiManajemen di pom induk:
sumber
Seperti yang Anda katakan;
dependencyManagement
digunakan untuk menarik semua informasi ketergantungan ke file POM umum, menyederhanakan referensi dalam file POM anak.Ini menjadi berguna ketika Anda memiliki banyak atribut yang Anda tidak ingin mengetik ulang di bawah beberapa proyek anak-anak.
Akhirnya,
dependencyManagement
dapat digunakan untuk menentukan versi standar artefak untuk digunakan di berbagai proyek.sumber
Masih ada satu hal yang tidak cukup disorot, menurut pendapat saya, dan itu adalah warisan yang tidak diinginkan .
Berikut ini contoh tambahan:
Saya menyatakan di
parent
pom saya :ledakan! Saya memilikinya di modul saya
Child A
,Child B
danChild C
:version 18.0
dalamChild B
jika saya mau.Tetapi bagaimana jika saya akhirnya tidak membutuhkan jambu biji
Child C
, dan juga di masa depanChild D
danChild E
modul?Mereka masih akan mewarisinya dan ini tidak diinginkan! Ini seperti bau kode Java God Object, di mana Anda mewarisi beberapa bit berguna dari sebuah kelas, dan sejumlah hal yang tidak diinginkan juga.
Di sinilah
<dependencyManagement>
berperan. Ketika Anda menambahkan ini ke pom orang tua Anda, semua modul anak Anda BERHENTI melihatnya . Dan dengan demikian Anda dipaksa untuk masuk ke setiap modul individu yang TIDAK membutuhkannya dan mendeklarasikannya lagi (Child A
danChild B
, tanpa versi sekalipun).Dan, jelas, Anda tidak melakukannya untuk itu
Child C
, dan dengan demikian modul Anda tetap ramping.sumber
<dependencyManagement>
pom induk maka dependensi default tidak akan diwarisi di pom anak? Karena dalam dokumen: maven.apache.org/guides/introduction/... saat menjelaskan penggunaan kedua<dependencyManagement>
sepertinya akan diwarisi secara default. Pada satu baris mereka mengatakan bahwa: "Ketika maven dijalankan pada proyek B, versi 1.0 artefak a, b, c, dan d akan digunakan terlepas dari versi yang ditentukan dalam pom mereka" meskipun "b" tidak digunakan dalam proyek BAda beberapa jawaban yang menguraikan perbedaan antara
<depedencies>
dan<dependencyManagement>
tag dengan pakar.Namun, beberapa poin diuraikan di bawah ini dalam cara yang ringkas:
<dependencyManagement>
memungkinkan untuk menggabungkan semua dependensi (digunakan pada level pom anak) yang digunakan di berbagai modul - kejelasan , manajemen versi dependensi pusat<dependencyManagement>
memungkinkan untuk dengan mudah meningkatkan / menurunkan ketergantungan berdasarkan kebutuhan, dalam skenario lain ini perlu dilakukan di setiap tingkat anak pom - konsistensi<dependencies>
tag selalu diimpor, sementara dependensi yang disediakan di<dependencyManagement>
dalam parent pom akan diimpor hanya jika child pom memiliki entri masing-masing dalam<dependencies>
tag -nya .sumber
Maaf saya sangat terlambat ke pesta.
Biarkan saya mencoba menjelaskan perbedaan menggunakan
mvn dependency:tree
perintahPerhatikan contoh di bawah ini
POM Induk - Proyek Saya
POM anak - modul data
POM Anak - modul aplikasi (tidak memiliki ketergantungan ekstra, sehingga membiarkan dependensi kosong)
Saat menjalankan
mvn dependency:tree
perintah, kami mendapatkan hasil sebagai berikutGoogle jambu biji terdaftar sebagai dependensi di setiap modul (termasuk orang tua), sedangkan apache commons terdaftar sebagai ketergantungan hanya dalam modul data (bahkan tidak dalam modul induk)
sumber
Jika dependensi didefinisikan dalam elemen dependensi Manajemen pom tingkat atas, proyek anak tidak harus secara eksplisit mencantumkan versi dependensi. jika proyek anak mendefinisikan suatu versi, itu akan menimpa versi yang terdaftar di bagian Manajemen ketergantungan POM tingkat atas. Artinya, versi dependensiManagement hanya digunakan ketika anak tidak mendeklarasikan versi secara langsung.
sumber
Di POM induk, perbedaan utama antara
<dependencies>
dan<dependencyManagement>
adalah:Artefak yang ditentukan dalam
<dependencies>
bagian ini SELALU akan dimasukkan sebagai ketergantungan modul anak.Artefak yang ditentukan dalam bagian, hanya akan dimasukkan dalam modul anak jika mereka juga ditentukan dalam bagian dari modul anak itu sendiri. Mengapa ada baiknya Anda bertanya? karena Anda menentukan versi dan / atau ruang lingkup di induknya, dan Anda dapat mengabaikannya ketika menentukan dependensi dalam POM anak. Ini dapat membantu Anda menggunakan versi terpadu untuk dependensi untuk modul anak, tanpa menentukan versi di setiap modul anak.
sumber
Hanya dengan kata-kata saya sendiri, Anda
parent-project
membantu Anda memberikan 2 jenis dependensi:<dependencies>
bagian di Andaparent-project
diwarisi oleh semuachild-projects
child-projects
. Dengan demikian, Anda menggunakan<dependencyManagement>
bagian ini, untuk menyatakan semua dependensi yang akan Anda gunakan dalam perbedaan Andachild-projects
. Yang paling penting adalah bahwa, di bagian ini, Anda mendefinisikan<version>
sehingga Anda tidak perlu mendeklarasikannya lagi dichild-project
.Pandangan
<dependencyManagement>
saya (koreksi saya jika saya salah) hanya berguna dengan membantu Anda memusatkan versi dependensi Anda. Ini seperti semacam fitur pembantu.sumber
Di Eclipse, ada satu fitur lagi di
dependencyManagement
. Ketikadependencies
digunakan tanpa itu, dependensi yang tidak ditemukan terlihat dalam file pom. JikadependencyManagement
digunakan, dependensi yang belum terpecahkan tetap tidak diperhatikan dalam file pom dan kesalahan hanya muncul di file java. (impor dan semacamnya ...)sumber
Perbedaan antara keduanya paling baik dibawa dalam apa yang tampaknya definisi yang diperlukan dan cukup dari elemen Manajemen ketergantungan yang tersedia di dokumen situs web Maven:
manajemen ketergantungan
"Informasi dependensi default untuk proyek-proyek yang mewarisi dari ini. Ketergantungan pada bagian ini tidak segera diselesaikan. Alih-alih, ketika POM yang diturunkan dari ini menyatakan ketergantungan yang dijelaskan oleh groupId dan artifactId yang cocok, versi dan nilai-nilai lain dari bagian ini digunakan untuk dependensi itu jika belum ditentukan. " [ https://maven.apache.org/ref/3.6.1/maven-model/maven.html ]
Itu harus dibaca bersama dengan beberapa informasi lain yang tersedia di halaman yang berbeda:
“..Set minimal informasi untuk mencocokkan referensi dependensi dengan dependensi bagian Manajemen sebenarnya {groupId, artifactId, type, classifier}. Dalam banyak kasus, dependensi ini akan merujuk pada artefak jar tanpa classifier. Ini memungkinkan kita untuk menyingkat identitas yang diatur ke {groupId, artifactId}, karena default untuk bidang isinya adalah jar, dan classifier defaultnya adalah nol. ” [ https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html ]
Dengan demikian, semua sub-elemen (ruang lingkup, pengecualian dll,) dari elemen dependensi - selain groupId, artifactId, tipe, classifier, bukan hanya versi - tersedia untuk penguncian / default pada titik (dan dengan demikian diwarisi dari ada seterusnya) Anda menentukan dependensi dalam dependencyElement. Jika Anda telah menentukan ketergantungan dengan sub-elemen jenis dan klasifikasi (lihat halaman web yang dikutip pertama untuk memeriksa semua sub-elemen) masing-masing bukan jar dan bukan nol, Anda akan memerlukan {groupId, artifactId, classifier, type} untuk referensi (menyelesaikan) ketergantungan itu pada titik mana pun dalam warisan yang berasal dari elemen Manajemen dependensi. Lain, {groupId, artifactId} akan cukup jika Anda tidak bermaksud untuk menimpa default untuk classifier dan tipe (masing-masing jar dan null). Jadi default adalah kata kunci yang baik dalam definisi itu; sub-elemen (selain groupId),
Jadi, setiap elemen ketergantungan di luar dependensiManagement, baik sebagai referensi ke beberapa elemen dependensiManagement atau sebagai standalone segera diselesaikan (yaitu diinstal ke repositori lokal dan tersedia untuk classpath).
sumber