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
  2. Cara memeriksa konflik
  3. Ringkasan

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.

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.