Artefak dari dependensi dapat dikecualikan dengan mendeklarasikan sebuah <exclusions>
elemen di dalam a. <dependency>
Namun dalam hal ini diperlukan untuk mengecualikan artefak yang diwarisi dari project induk. Berikut kutipan dari Badan POM yang sedang dibahas:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
artefak, bergantung pada javax.mail:mail-1.4.jar
, dan ALL-DEPS
bergantung pada versi lain dari pustaka yang sama. Karena fakta bahwa mail.jar
dari yang ALL-DEPS
ada di lingkungan eksekusi, meskipun tidak diekspor, bertabrakan dengan mail.jar
yang ada di induk, yang dicakup sebagai compile
.
Solusinya mungkin dengan menyingkirkan mail.jar dari POM induk, tetapi sebagian besar proyek yang mewarisi basis, membutuhkannya (seperti ketergantungan transtif untuk log4j). Jadi Yang ingin saya lakukan adalah mengecualikan pustaka induk dari proyek anak , karena ini bisa dilakukan jika base
merupakan ketergantungan dan bukan pom induk:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Anda dapat mengelompokkan dependensi Anda dalam proyek yang berbeda dengan kemasan
pom
seperti yang dijelaskan oleh Praktik Terbaik Sonatypes :dan mereferensikannya dari orang tua-pom Anda (perhatikan ketergantungannya
<type>pom</type>
):Proyek anak Anda mewarisi pom induk ini seperti sebelumnya. Tapi sekarang, ketergantungan email bisa dikecualikan di proyek-anak dalam
dependencyManagement
blok:sumber
Jangan gunakan pom orang tua
Ini mungkin terdengar ekstrem, tetapi dengan cara yang sama "warisan neraka" adalah alasan beberapa orang berpaling dari Pemrograman Berorientasi Objek (atau lebih suka komposisi daripada warisan ), hapus
<parent>
blok bermasalah dan salin dan tempel apa pun yang<dependencies>
Anda butuhkan (jika tim Anda memberi Anda kebebasan ini).Asumsi bahwa pemisahan pom menjadi orang tua dan anak untuk "digunakan kembali" dan "menghindari redunansi" harus diabaikan dan Anda harus melayani kebutuhan mendesak Anda terlebih dahulu (penyembuhannya lebih buruk daripada penyakitnya). Selain itu, redundansi memiliki kelebihan - yaitu kemandirian terhadap perubahan eksternal (yaitu stabilitas).
Ini lebih mudah daripada kedengarannya jika Anda menghasilkan pom yang efektif (gerhana menyediakannya tetapi Anda dapat membuatnya dari baris perintah dengan
mvn help:effective
).Contoh
Saya ingin menggunakan
logback
sebagai pengikat slf4j saya, tetapi pom orang tua saya menyertakanlog4j
ketergantungan. Saya tidak ingin pergi dan harus mendorong ketergantungan anak-anak lain pada log4j ke dalampom.xml
file mereka sendiri sehingga milik saya tidak terhalang.sumber
Definisikan ulang ketergantungan (di pom anak) dengan
scope
sistem yang mengarah ke toples kosong:Stoples hanya dapat berisi satu file kosong:
sumber
notepad empty.class
kemudianjar cvf empty.jar empty.class
untuk menghasilkan jar kosong.Sudahkah Anda mencoba secara eksplisit menyatakan versi mail.jar yang Anda inginkan? Resolusi ketergantungan Maven harus menggunakan ini untuk resolusi ketergantungan pada semua versi lainnya.
sumber
Taruhan terbaik adalah membuat dependensi yang tidak selalu ingin Anda warisi secara intransitif.
Anda dapat melakukan ini dengan menandainya di pom induk dengan cakupan yang disediakan.
Jika Anda masih ingin orang tua mengelola versi deps ini, Anda dapat menggunakan
<dependencyManagement>
tag untuk menyiapkan versi yang Anda inginkan tanpa mewarisi secara eksplisit, atau meneruskan pewarisan tersebut ke turunannya.sumber
Ketika Anda memanggil sebuah paket tetapi tidak menginginkan beberapa dependensinya, Anda dapat melakukan hal seperti ini (dalam hal ini saya tidak ingin log4j lama ditambahkan karena saya perlu menggunakan yang lebih baru):
Ini bekerja untuk saya ... tapi saya cukup baru mengenal java / maven jadi mungkin belum optimal.
sumber
Aku benar-benar perlu melakukan hal kotor ini ... Begini caranya
Saya mendefinisikan ulang dependensi tersebut dengan cakupan
test
. Scopeprovided
tidak berhasil untuk saya.Kami menggunakan plugin Spring Boot untuk membuat botol gemuk. Kami memiliki modul umum yang mendefinisikan pustaka umum, misalnya Springfox swagger-2. Layanan super saya harus memiliki kesamaan orang tua (tidak ingin melakukannya, tetapi aturan perusahaan memaksa!)
Jadi orang tua atau milik saya punya pom.
Dan pom layanan super saya .
Ini adalah ukuran artefak lemak terakhir
Juga jawaban ini layak untuk disebutkan - Saya ingin melakukannya, tetapi saya malas ... https://stackoverflow.com/a/48103554/4587961
sumber
Kita dapat menambahkan pom induk sebagai dependensi dengan tipe pom dan membuat pengecualian untuk itu. Karena bagaimanapun pom induk diunduh. Ini berhasil untuk saya
sumber