Odpravljanje konfliktov odvisnosti v Mavenu z ukazom dependency:tree
Datum objave:
Posodobljeno:
Tehnični članki > Odpravljanje konfliktov odvisnosti v Mavenu z ukazom dependency:tree
Stanje in varna uporaba v letu 2026
Bistvo: Z ukazom mvn dependency:tree preglejte razrešeni graf in poiščite pot, ki je uvedla nepričakovano različico. Konflikt nato premišljeno odpravite s posodobljeno neposredno odvisnostjo, razdelkom dependencyManagement ali ozko in utemeljeno izključitvijo.
Kaj boste izvedeli
- Kako lahko pravilo »najbližje definicije« izbere drugo različico od pričakovane prehodne odvisnosti.
- Kako s podrobnim in filtriranim izpisom drevesa zožiti iskanje konflikta.
- Zakaj brisanje datotek iz lokalnega repozitorija ali dodajanje naključnih izključitev ni trajna rešitev.
Komu je članek namenjen? Razvijalcem Java, ki preiskujejo napake pri povezovanju, nepričakovane razrede ali ranljive prehodne različice.
Opomba za leto 2026: Možnosti vtičnika se med različicami razlikujejo, zato preverite trenutno dokumentacijo Maven Dependency Plugin. Pregled grafa združite z odobrenim postopkom analize sestave programske opreme; urejeno drevo samo po sebi ne dokazuje, da so odvisnosti varne.
Varnostna opomba: Ukazi in konfiguracijski primeri iz prvotnega članka niso bili znova preizkušeni v sodobnem produkcijskem okolju. Pred uporabo v ločenem preizkusnem okolju preverite podprte različice, izdelajte varnostne kopije ter določite nadzor dostopa in postopek povrnitve.
Uradni viri
Pregled
Maven samodejno razrešuje odvisnosti in ob več zahtevanih različicah po pravilih posredovanja izbere eno. Privzeto zaradi tega ne prekine builda, zato je treba graf pregledati ali uveljaviti pravilo konvergence.
Kazalo vsebine
1. Ko v Mavenu pride do konflikta odvisnosti
Maven iz POM-ov samodejno sestavi graf neposrednih in prehodnih odvisnosti. Podrobnejši opis tega postopka je v naslednjem članku.
Kako Maven razrešuje prehodne odvisnosti iz repozitorijev
Ko več poti zahteva različne različice istega artefakta, Maven eno izbere po pravilih posredovanja. Brez dodatne nastavitve konflikt ne povzroči nujno napake, zato ga je treba izrecno preveriti.
2. Kako preveriti
Konflikte odvisnosti lahko preverite na dva glavna načina:
- z vtičnikom, ki preverjanje vključi v postopek builda;
- z ročnim pregledom razrešenega grafa.
Vtičnik se nastavi v datoteki pom.xml in lahko ob neskladju prekine build. Ročni ukaz pa je namenjen sprotnemu pregledu grafa.
2-1. Uveljavljanje konvergence odvisnosti
Uradna dokumentacija za pravilo konvergence je na naslednji strani.
Pravilo dependencyConvergence v Maven Enforcer Pluginu
Spodnja zgodovinska konfiguracija prikazuje pravilo. Ne kopirajte stare različice 3.0.0-M3 nespremenjene, temveč izberite trenutno podprto različico vtičnika.
<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>
Ko je pravilo vključeno v build, nekonvergenten graf odvisnosti povzroči napako, kot je prikazana spodaj.
[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.
Brez tega pravila se lahko build kljub več zahtevanim različicam uspešno konča. Pravilo vključite, kadar mora projekt zahtevati konvergenco odvisnosti.
2-2. Pregled drevesa odvisnosti
Graf odvisnosti preverite z naslednjim ukazom.
mvn dependency:tree -Dverbose
Odvisno od različice vtičnika lahko podrobni izpis poti, ki jih je posredovanje različic izpustilo, označi z "omitted for conflict". Naslednji zgodovinski ukaz izpis omeji na te vrstice. "find" je ukaz sistema Windows; v Linuxu se za enak namen uporablja "grep".
mvn dependency:tree -Dverbose | find "omitted for conflict"
Iz drevesa je mogoče razbrati pot, po kateri je posamezna različica prišla v projekt.
3. Povzetek
Za razumevanje razrešenega grafa uporabite dependency:tree. Če projekt zahteva konvergenco, to pravilo uveljavite v buildu s trenutno podprto različico Maven Enforcer Plugina. Konflikt odpravite premišljeno z nadgradnjo odvisnosti, dependencyManagementom ali ozko utemeljeno izključitvijo.
Pri uporabi v novejšem okolju upoštevajte tudi opombe o različicah in varnosti na začetku članka.