Felsök Maven-beroendekonflikter med dependency:tree
Publicerad:
Uppdaterad:
Tekniska artiklar > Felsök Maven-beroendekonflikter med dependency:tree
Status 2026 och säker användning
Slutsats: Kör mvn dependency:tree för att granska beroendegrafen som Maven faktiskt använder och hitta sökvägen som förde in en oväntad version. Korrigera deklarationen med ett uppdaterat direkt beroende, dependencyManagement eller en väl avgränsad och motiverad exkludering.
Det här går artikeln igenom
- Hur medling med "närmaste definition" kan dölja en begärd transitiv version.
- Hur detaljerad och filtrerad utdata från beroendeträdet avgränsar en konflikt.
- Varför borttagning av lokala repositoryfiler eller godtyckliga exkluderingar inte är hållbara lösningar.
Målgrupp: Java-utvecklare som utreder länkningsfel, oväntade klasser eller sårbara transitiva beroenden.
Läge 2026: Pluginalternativen varierar mellan versioner; kontrollera därför den aktuella dokumentationen för Maven Dependency Plugin. Komplettera granskningen av beroendegrafen med organisationens godkända analys av mjukvarukomponenter. Ett konfliktfritt träd bevisar inte att beroendena är säkra.
Säkerhetsinformation: Kommandona och konfigurationsexemplen i originalartikeln har inte testats på nytt i en aktuell produktionsmiljö. Kontrollera versioner med support, säkerhetskopior, åtkomstkontroller och återställningssteg i en separat testmiljö innan de används.
Viktiga officiella källor
Översikt
Maven löser JAR-beroenden automatiskt, men standardkonfigurationen rapporterar inte alla versionsskillnader som fel. Här visas hur beroendeträdet granskas och hur strikt konvergenskontroll kan aktiveras.
Innehållsförteckning
1. När bibliotekskonflikter uppstår i Maven
Maven löser Java-bibliotekens beroenden automatiskt. När en JAR-fil deklareras hämtar Maven även de transitiva JAR-filer som den behöver. Följande artikel beskriver mekanismen närmare.
Så löser Maven transitiva beroenden via repositories
Om flera beroendesökvägar begär olika versioner väljer Maven normalt en version genom sin medlingsregel. För att upptäcka att flera versioner har begärts krävs en uttrycklig kontroll.
2. Så granskas och hanteras konflikter
Två kompletterande metoder gör beroendegrafen och projektets regler tydliga:
- bind en konvergensregel till builden med Maven Enforcer Plugin och
- granska det effektiva beroendeträdet med dependency:tree.
Enforcer-regeln kan stoppa en build vars graf inte konvergerar. dependency:tree är ett analyskommando som visar vilka sökvägar och medlingsregler som ledde till den valda versionen.
2-1. Kräv konvergens med Maven Enforcer Plugin
Den officiella dokumentationen för regeln dependencyConvergence finns här.
Dokumentation för Maven Enforcers dependencyConvergence-regel
Lägg till följande inställningar i 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>
Pluginversionen 3.0.0-M3 i exemplet är historisk. Välj en aktuell version med support och kontrollera dess dokumentation innan konfigurationen används.
Med inställningen ovan misslyckas builden med ett fel om beroendena inte konvergerar.
[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.
Utan pluginen kan builden slutföras trots att olika versioner begärs via olika sökvägar. Aktivera regeln om strikt konvergens är ett krav i projektet.
2-2. Granska beroendeträdet
Granska beroendena med följande kommando.
mvn dependency:tree -Dverbose
Beroende på versionen av Maven Dependency Plugin och dess verbose-beteende kan versionsmedling visas med texten "omitted for conflict". Utdata kan då filtreras till dessa rader med nästa kommando. "find" används i Windows; motsvarande filter i Linux är "grep".
mvn dependency:tree -Dverbose | find "omitted for conflict"
Kommandoutdata visar vilka versioner som begärdes och vilken version Maven valde.
3. Sammanfattning
Använd dependency:tree för att förstå Mavens valda beroendegraf. Om projektet kräver strikt versionskonvergens kan Maven Enforcers dependencyConvergence-regel stoppa en build när grafen inte konvergerar.
Åtgärda orsaken med en lämplig uppgradering, en avsiktlig version i dependencyManagement eller en snävt motiverad exclusion. Kombinationen av trädanalys och en medvetet konfigurerad regel gör både Mavens versionsval och projektets krav synliga.