Depanarea conflictelor de dependență Maven cu dependency:tree


Data publicării:

Actualizat:


Articole tehnice > Depanarea conflictelor de dependență Maven cu dependency:tree

Contextul din 2026 și utilizarea în siguranță

Concluzie: Rulați mvn dependency:tree pentru a inspecta graful rezolvat și a identifica traseul care introduce versiunea neașteptată. Corectați declarațiile în mod explicit printr-o dependență directă, dependencyManagement sau o excludere strict justificată.

Ce vei învăța

  • Cum poate regula „nearest definition” să selecteze altă versiune decât cea cerută tranzitiv.
  • Cum ajută outputul complet sau filtrat al dependency tree-ului la restrângerea conflictului.
  • De ce ștergerea cache-ului local sau adăugarea unor excluderi la întâmplare nu reprezintă o soluție durabilă.

Cui se adresează: Dezvoltatorilor Java care investighează linkage errors, clase neașteptate sau versiuni tranzitive vulnerabile.

Contextul din 2026: Opțiunile pluginului diferă între versiuni; consultați documentația Maven Dependency Plugin folosită de proiect. Combinați analiza grafului cu procesul de software composition analysis al organizației. Un dependency tree fără conflicte nu dovedește că toate dependențele sunt sigure.

Notă de siguranță: comenzile și exemplele de configurare din articolul original nu au fost reluate într-un mediu de producție actual. Verificați versiunile acceptate, copiile de rezervă, controalele de acces și pașii de retragere într-un mediu de testare separat înainte de a le aplica.

Surse oficiale principale

Prezentare generală

Maven rezolvă automat dependențele JAR, dar versiunea aleasă nu este întotdeauna evidentă din POM. Articolul prezintă două metode: oprirea buildului prin Maven Enforcer Plugin și investigarea traseelor cu dependency:tree.

Cuprins

  1. De ce apar conflicte de dependență în Maven
  2. Cum se verifică un conflict
  3. Rezumat

1. De ce apar conflicte de dependență în Maven

Maven include și dependențele tranzitive cerute de artifactele declarate. Mai multe trasee pot solicita același artifact în versiuni diferite, iar Maven trebuie să aleagă o singură versiune pentru classpath. Articolul următor descrie mecanismul.

Cum rezolvă Maven dependențele tranzitive din repository-uri

Rezolvarea produce o versiune, dar alegerea poate fi incompatibilă cu aplicația. Fără o regulă suplimentară, problema poate apărea abia la compilare sau la rulare. De aceea, graful efectiv trebuie verificat explicit.

2. Cum se verifică un conflict

Articolul folosește două abordări complementare:

  • regula dependencyConvergence din Maven Enforcer Plugin; și
  • inspecția manuală a dependency tree-ului.

Prima abordare transformă conflictul într-o eroare de build, iar a doua arată traseul care a introdus fiecare versiune. Cele două metode pot fi folosite împreună.

2-1. Activarea Maven Enforcer Plugin

Documentația oficială a regulii dependencyConvergence descrie comportamentul și opțiunile disponibile.

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

Adăugați configurația următoare în 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>

Cu această configurație, regula raportează traseele care solicită versiuni diferite și oprește buildul. Outputul arată astfel.

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

Fără această regulă, Maven poate finaliza buildul folosind versiunea rezultată din mediere. Activați verificarea în CI dacă orice divergență trebuie detectată înainte de publicarea artifactului.

2-2. Verificarea dependency tree-ului înainte de build

Comanda următoare afișează în detaliu dependency tree-ul.

mvn dependency:tree -Dverbose

Versiunile nealese sunt marcate cu "omitted for conflict". Outputul poate fi filtrat pentru a afișa numai aceste linii. Exemplul folosește find în Windows; în Linux utilizați grep.

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

Examinați întregul traseu, nu doar numele artifactului, pentru a identifica dependența care a introdus versiunea.

3. Rezumat

dependency:tree explică originea conflictului, iar Maven Enforcer Plugin împiedică reapariția lui în build. După identificarea cauzei, controlați versiunea în mod explicit și testați aplicația; nu ștergeți cache-ul și nu adăugați excluderi fără a înțelege efectul.