Menangani konflik dependensi Maven dengan dependency:tree
Tanggal publikasi:
Diperbarui:
Artikel teknis > Menangani konflik dependensi Maven dengan dependency:tree
Konteks 2026 dan penggunaan yang aman
Kesimpulan: Jalankan mvn dependency:tree untuk melihat graf dependensi yang akhirnya dipilih Maven, lalu telusuri jalur yang membawa versi yang tidak diharapkan. Perbaiki deklarasinya secara eksplisit melalui dependensi langsung, dependencyManagement, atau pengecualian yang memang diperlukan.
Yang akan Anda pelajari
- Bagaimana aturan mediasi "definisi terdekat" dapat membuat Maven memilih versi yang berbeda dari versi transitif yang diminta.
- Bagaimana output dependency tree yang lengkap atau difilter membantu mempersempit sumber konflik.
- Mengapa menghapus cache repositori lokal atau menambahkan pengecualian secara acak bukan solusi jangka panjang.
Untuk siapa ini: Pengembang Java yang sedang menyelidiki linkage error, class yang tidak sesuai harapan, atau versi dependensi transitif yang rentan.
Konteks 2026: Opsi plugin dapat berubah antarversi, jadi periksa dokumentasi Maven Dependency Plugin yang berlaku. Padukan pemeriksaan graf dengan proses software composition analysis yang disetujui organisasi; dependency tree tanpa konflik belum membuktikan bahwa seluruh dependensi aman.
Catatan keamanan: Contoh perintah dan konfigurasi dalam artikel asli belum dijalankan ulang dalam lingkungan produksi saat ini. Verifikasi versi yang didukung, cadangan, kendali akses, dan langkah rollback dalam lingkungan tes yang terpisah sebelum menerapkannya.
Sumber resmi utama
Ikhtisar
Maven menyelesaikan dependensi JAR secara otomatis, tetapi versi yang dipilihnya tidak selalu terlihat jelas dari POM. Artikel ini menunjukkan dua cara untuk mendeteksi konflik dependensi: menghentikan build dengan Maven Enforcer Plugin dan memeriksa hasil resolusi melalui dependency:tree.
Daftar isi
1. Mengapa konflik dependensi terjadi di Maven
Maven juga mengambil dependensi transitif yang diperlukan oleh JAR yang Anda deklarasikan. Karena beberapa jalur dapat meminta artifact yang sama dengan versi berbeda, Maven harus memilih satu versi untuk classpath. Penjelasan lebih rinci tentang mekanisme tersebut tersedia pada artikel berikut.
Cara Maven menyelesaikan dependensi transitif dari repositori
Proses resolusi memang menghasilkan satu versi, tetapi pilihan itu belum tentu sesuai dengan kebutuhan aplikasi. Tanpa aturan atau pemeriksaan tambahan, konflik dapat luput hingga muncul sebagai error saat kompilasi atau runtime. Karena itu, hasil resolusi perlu diperiksa secara eksplisit.
2. Cara memeriksa konflik
Dua pendekatan yang digunakan dalam artikel ini adalah:
- menjalankan aturan dependencyConvergence melalui Maven Enforcer Plugin; dan
- memeriksa dependency tree secara manual sebelum build.
Pendekatan pertama menjadikan konflik sebagai kegagalan build, sedangkan pendekatan kedua membantu menelusuri jalur dependensi saat melakukan diagnosis. Keduanya dapat dipakai bersama.
2-1. Mengaktifkan Maven Enforcer Plugin
Dokumentasi resmi aturan dependencyConvergence menjelaskan perilaku dan opsi yang tersedia.
http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html
Tambahkan konfigurasi berikut ke pom.xml.
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<dependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
...
</project>
Dengan konfigurasi tersebut, aturan akan melaporkan jalur dependensi yang meminta versi berbeda dan menggagalkan build. Contoh keluarannya adalah sebagai berikut.
[WARNING]
Dependency convergence error for org.apache.commons:commons-collections4:4.1 paths to dependency are:
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
+-org.apache.poi:poi:3.17
+-org.apache.commons:commons-collections4:4.1
and
+-com.example.todo:todo-web:1.0.0-SNAPSHOT
+-org.apache.commons:commons-collections4:4.0
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability. See above detailed error message.
Tanpa aturan ini, Maven dapat menyelesaikan build dengan versi hasil mediasi. Aktifkan pemeriksaan di CI jika konflik harus selalu terdeteksi sebelum artifact diterbitkan.
2-2. Memeriksa dependency tree sebelum build
Jalankan perintah berikut untuk menampilkan dependency tree secara rinci.
mvn dependency:tree -Dverbose
Dependensi yang tidak dipilih karena konflik ditandai dengan "omitted for conflict". Output dapat difilter agar hanya baris tersebut yang terlihat. Contoh berikut memakai find di Windows; gunakan grep pada Linux.
mvn dependency:tree -Dverbose | find "omitted for conflict"
Periksa seluruh jalurnya, bukan hanya nama artifact, untuk mengetahui dependensi mana yang memperkenalkan versi tersebut.
3. Ringkasan
dependency:tree berguna untuk menelusuri sumber konflik, sedangkan Maven Enforcer Plugin dapat mencegah konflik yang sama lolos kembali ke build. Setelah menemukan penyebabnya, nyatakan versi yang diinginkan secara terkontrol dan uji aplikasi; jangan sekadar menghapus cache atau menambahkan pengecualian tanpa memahami dampaknya.
Artikel teknis
Profil
Kontak