Apa perbedaan antara ketergantungan tipe "pom" dengan cakupan "impor" dan tanpa "impor"?

112

Mulai dari Maven 2.0.9 ada kemungkinan untuk dimasukkan

<type>pom</type>
<scope>import</scope>

di <dependencyManagement>bagian tersebut.

Seperti yang saya pahami, itu akan "diganti" dengan dependensi yang termasuk dalam pom ini seolah-olah mereka awalnya didefinisikan di sini.

Apa perbedaan antara solusi di atas dan ketergantungan sederhana ke pom tanpa importruang lingkup ini (saya melihat yang terakhir disebut "pengelompokan ketergantungan")? Apakah satu-satunya perbedaan bahwa dependensi yang "dikelompokkan" memiliki prioritas lebih rendah saat menyelesaikan prioritas dependensi?

grafthez
sumber

Jawaban:

187

Anda hanya dapat mengimpor dependensi terkelola . Ini berarti Anda hanya dapat mengimpor POM lain ke dependencyManagementbagian POM proyek Anda. yaitu

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

Apa yang kemudian terjadi adalah bahwa semua dependensi yang ditentukan di dependencyManagementbagian other-pom-artifact-idini disertakan di dependencyManagementbagian POM Anda . Anda kemudian dapat merujuk dependensi ini di dependencybagian POM Anda (dan semua POM turunannya) tanpa harus menyertakan versiondll.

Namun jika di POM Anda, Anda cukup menentukan dependensi normal ke other-pom-artifact-idsemua dependenciesdari dependencybagian other-pom-artifact-idtersebut dimasukkan secara transitif dalam proyek Anda - namun dependensi yang ditentukan di dependencyManagementbagian other-pom-artifact-idtersebut tidak disertakan sama sekali.

Jadi pada dasarnya dua mekanisme berbeda digunakan untuk mengimpor / termasuk dua jenis dependensi yang berbeda (dependensi terkelola dan dependensi normal).

Ada halaman bagus di situs web maven, yang dapat menjelaskan hal ini jauh lebih baik daripada yang saya bisa, Manajemen Ketergantungan di Maven dan juga berisi informasi khusus tentang mengimpor ketergantungan .

DB5
sumber
1
Jika pomA di adalah induk dari pomB, dapatkah Anda menempatkan B dalam manajemen ketergantungan proyek A dengan cakupan import?
Janez Kuhar
jawaban yang bagus untuk menjelaskan cara kerjanya, tapi mengapa ?? mengapa Anda tidak ingin menyertakan dependensi lain secara transitif? juga bisakah kamu melakukan keduanya? import other-pom-artifact-id dan kemudian deklarasikan other-pom-artifact-id sebagai dependensi juga?
Junchen Liu
Satu artikel di DZone menyatakan sesuatu yang berbeda: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>KERING dan Perang Kurus
karena
1
@JunchenLiu: Jadi katakanlah Anda hanya menggunakan beberapa fitur proyek A, jadi Anda dapat memilih untuk hanya menyertakan dependensi transitif yang diperlukan untuk fitur itu. Anda bisa mengatasinya dengan menggunakan <exclude> di <dependency> juga. Misalnya, periksa
Nitiraj
15

Anda tidak dapat memiliki pomproyek tipe sebagai simple dependencyproyek lain. (Ya, Anda bisa - tetapi itu tidak akan berguna). Hanya ada parent-childhubungan. Ini pada dasarnya managing dependency through inheritance.

importlingkup untuk pomketergantungan tipe di <dependencyManagement>bagian memungkinkan Anda mencapai yang setara dengan multiple inheritance.

Anda dapat memiliki perbedaan poms- masing-masing managingsekelompok dependensi terkait. Proyek yang menggunakan ini dapat importini pomsdan kemudian menentukan dependensi yang mereka butuhkan tanpa perlu khawatir tentang versinya. Ini pada dasarnya adalah bill of materialskonsep, yang diilustrasikan dalam tautan yang ditentukan oleh @ DB5.

Ini membantu menjaga parent pomsproyek multi-modul yang kompleks agar tidak terlalu besar dan berat.

Raghuram
sumber
8
Apakah kamu yakin Saya telah menempatkan pom biasa (memiliki dependensi sendiri) sebagai dependensi reguler di proyek lain (perang pengemasan) dan mendapatkan semua dependensi dari proyek pom termasuk dalam WEB-INF / lib proyek target. Itulah mengapa saya mengajukan pertanyaan ini :)
grafthez
2
Terima kasih @Raghuram, benar-benar lupa menyebutkan opsi POM induk saat menjawab pertanyaan. Adapun memiliki proyek tipe pom sebagai ketergantungan sederhana ini dimungkinkan. Seperti disebutkan dalam pertanyaan awal, ini dapat digunakan untuk mengelompokkan dependensi
DB5
5

Dua konsep, sangat mirip dengan paradigma pemrograman berorientasi objek, akan membantu menjawab pertanyaan:

  1. Bagian dependencyManagement hanya mendeklarasikan dependensi dan detailnya dalam project saat ini - tujuannya adalah mengelola detail dan digunakan kembali di project lain, baik melalui pewarisan ( induk ) atau impor ( cakupan ). Ini seperti mendeklarasikan tipe data dalam program dan membuatnya tersedia untuk digunakan.

  2. Bagian ketergantungan mendefinisikan penggunaan sebenarnya dari ketergantungan dalam proyek, secara opsional mewarisi detail (yaitu, versi, dll.) Dari ketergantungan yang dideklarasikan di bawah dependencyManagment . Itulah mengapa Anda akan kehilangan dependensi jika Anda hanya meletakkannya di dependencyManagment . Ini analog dengan membuat instance variabel dari tipe data dalam program yang membutuhkannya.

mobil van
sumber
Itu bagus dan jelas tetapi menjawab pertanyaan yang berbeda dari pertanyaan di atas. :-)
Rick-777