dependency:tree ile Maven bağımlılık çakışmalarını giderme


Yayın tarihi:

Güncelleme:


Teknik makaleler > dependency:tree ile Maven bağımlılık çakışmalarını giderme

2026 bağlamı ve güvenli kullanım

Sonuç: Çözümlenen grafiği incelemek için mvn dependency:tree komutunu çalıştırın ve beklenmeyen sürümü hangi yolun getirdiğini belirleyin. Bildirimi güncel bir doğrudan bağımlılık, dependencyManagement veya dar kapsamlı ve gerekçeli bir exclusion ile bilinçli olarak düzeltin.

Ne öğreneceksiniz

  • "En yakın tanım" uzlaştırmasının istenen geçişli sürümü nasıl gizleyebileceği.
  • Ayrıntılı ve filtrelenmiş bağımlılık ağacı çıktısıyla çakışmanın kaynağını bulma.
  • Yerel repository dosyalarını silmenin veya rastgele exclusion eklemenin neden kalıcı bir çözüm olmadığı.

Kimler için: Linkage hatalarını, beklenmeyen sınıfları veya güvenlik açığı içeren geçişli sürümleri araştıran Java geliştiricileri.

2026 bağlamı: Plugin seçenekleri sürüme göre değişir; güncel Maven Dependency Plugin belgelerini kontrol edin. Grafik incelemesini kuruluşunuzun onayladığı yazılım bileşimi analiziyle birlikte yürütün. Temiz görünen bir bağımlılık ağacı, bağımlılıkların güvenli olduğunu tek başına kanıtlamaz.

Güvenlik notu: Orijinal makaledeki komutlar ve yapılandırma örnekleri mevcut üretim ortamında yeniden çalıştırılmamıştır. Desteklenen sürümleri, yedeklemeleri, erişim kontrollerini ve geri alma adımlarını uygulamadan önce ayrı bir test ortamında doğrulayın.

Başlıca resmî kaynaklar

Genel bakış

Maven, bağımlılık grafiğini çözerken aynı artefaktın farklı sürümleri arasında uzlaştırma yapar. Bu işlem, başka bir yolun istediği sürümü görünmez hâle getirebilir. Aşağıdaki yöntemlerle çözümlenen grafiği inceleyebilir ve proje için sürüm yakınsaması gerekiyorsa bunu zorunlu kılabilirsiniz.

İçindekiler

  1. Maven'da kütüphane çakışmaları oluştuğunda
  2. Nasıl kontrol edilir
  3. Özet

1. Maven'da kütüphane çakışmaları oluştuğunda

Maven doğrudan ve geçişli bağımlılıkları çözer; aynı artefaktın farklı sürümleri farklı yollardan istendiğinde bağımlılık uzlaştırması uygular. Repository ve POM akışının ayrıntıları için aşağıdaki makaleyi okuyun.

Maven repository'lerden geçişli bağımlılıkları nasıl çözer?

Build'in başarıyla tamamlanması, istenen tüm sürümlerin seçildiğini göstermez. Linkage hatası, beklenmeyen davranış veya güvenlik açığı bulunan geçişli bir bağımlılık araştırılırken çözümlenen grafik mutlaka incelenmelidir.

2. Nasıl kontrol edilir

Birbirini tamamlayan iki kontrol kullanılabilir:

  • Bağımlılık yakınsaması gerekiyorsa build'i başarısız kılmak;
  • Dependency Plugin ile çözümlenen grafiği incelemek.

İlk yöntem CI içinde tekrarlanabilir bir kural sağlar. İkinci yöntem ise Maven'ın belirli bir sürümü neden seçtiğini gösteren etkileşimli bir tanılama adımıdır.

2-1. Bağımlılık yakınsamasını zorunlu kılma

Maven Enforcer Plugin, sürüm yakınsamasını denetleyen dependencyConvergence kuralını sağlar:

http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html

Aşağıdaki tarihsel yapılandırma kuralın kullanımını gösterir. Eski plugin sürümünü aynen kopyalamak yerine desteklenen güncel sürümü seçin.

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>

Bu yapılandırma eklendiğinde Maven, aşağıdakine benzer bir sürüm yakınsama hatası üretir ve build başarısız olur.

[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.

Enforcer kuralı olmadan Maven uzlaştırmayı uygulayıp build'i başarıyla tamamlayabilir. Projeniz sürüm yakınsaması gerektiriyorsa kuralı CI yapılandırmasına ekleyin.

2-2. Bağımlılık ağacını inceleme

Çözümlenen bağımlılık ağacını aşağıdaki komutla görüntüleyin:

mvn dependency:tree -Dverbose

Çakışma varsa çıktıda "omitted for conflict" ifadesi görünür. Windows'ta aşağıdaki komutla yalnızca bu satırlar filtrelenebilir; Linux'ta find yerine grep kullanın.

mvn dependency:tree -Dverbose | find "omitted for conflict"

Filtrelenmiş çıktı bir adayı gösterir; asıl düzeltmeyi seçmeden önce tam bağımlılık ağacındaki yolları ve seçilen sürümü birlikte değerlendirin.

3. Özet

dependency:tree ile Maven'ın seçtiği sürümü ve bu sürümü getiren yolu belirleyin. Projede tam sürüm yakınsaması gerekiyorsa Enforcer kuralını CI içinde çalıştırın; ardından doğrudan bağımlılık, dependencyManagement veya gerekçeli bir exclusion kullanarak grafiği bilinçli biçimde düzeltin.