Maven atkarību konfliktu novēršana ar dependency:tree
Publikācijas datums:
Atjaunināts:
Tehniskie raksti > Maven atkarību konfliktu novēršana ar dependency:tree
2026. gada statuss un droša lietošana
Secinājums: palaidiet mvn dependency:tree, apskatiet atrisināto grafu un nosakiet ceļu, kas ieviesa neparedzēto versiju. Labojiet deklarāciju apzināti — ar atjauninātu tiešo atkarību, dependencyManagement vai precīzi pamatotu izslēgumu.
Ko jūs uzzināsiet
- Kā „tuvākās definīcijas” princips var paslēpt pieprasītu tranzitīvo versiju.
- Kā detalizēta un filtrēta atkarības koka izvade sašaurina konfliktu.
- Kāpēc failu dzēšana no lokālā repozitorija vai nejaušu izslēgumu pievienošana nav ilgtspējīgs risinājums.
Kam tas paredzēts: Java izstrādātājiem, kuri pēta sasaistes kļūdas, neparedzētas klases vai ievainojamas tranzitīvo atkarību versijas.
2026. gada konteksts: spraudņa opcijas dažādās versijās atšķiras, tāpēc skatiet aktuālo Maven Dependency Plugin dokumentāciju. Grafu pārbaudi papildiniet ar organizācijas apstiprinātu programmatūras komponentu analīzi; tīrs atkarību koks pats par sevi nepierāda, ka atkarības ir drošas.
Drošības piezīme. Sākotnējā rakstā esošās komandas un konfigurācijas piemēri nav atkārtoti izpildīti pašreizējā ražošanas vidē. Pirms to lietošanas pārbaudiet atbalstītās versijas, dublējumus, piekļuves vadīklas un atcelšanas darbības atsevišķā testa vidē.
Galvenie oficiālie avoti
Pārskats
Atkarību grafa veidošanas laikā Maven saskaņo versiju konfliktus, tāpēc citā ceļā pieprasīta versija var palikt nepamanīta. Rakstā parādīts, kā pārbaudīt atrisināto rezultātu un vajadzības gadījumā pieprasīt atkarību konverģenci.
Satura rādītājs
1. Kad Maven sistēmā rodas bibliotēku konflikti
Maven atrisina tiešās un tranzitīvās atkarības un pēc tam piemēro versiju saskaņošanu, ja dažādi ceļi pieprasa viena artefakta atšķirīgas versijas. Pamatā esošā repozitoriju un POM darbplūsma aprakstīta rakstā Kā Maven no repozitorijiem atrisina tranzitīvās atkarības.
Veiksmīgs build nepierāda, ka ir izvēlēta katra pieprasītā versija. Ja rodas sasaistes kļūdas, neparedzēta darbība vai ievainojama tranzitīvā atkarība, jāpārbauda faktiski atrisinātais grafs.
2. Kā pārbaudīt
Noderīgas ir divas savstarpēji papildinošas pārbaudes:
- apturēt build, ja projektā ir obligāta atkarību konverģence;
- apskatīt atrisināto grafu ar Maven Dependency Plugin.
Pirmo pārbaudi var atkārtojami izpildīt CI vidē. Otrā ir diagnostikas darbība, kas parāda, kāpēc Maven izvēlējās konkrētu versiju.
2-1. Atkarību konverģences pārbaude
Maven Enforcer Plugin nodrošina kārtulu dependencyConvergence, kas dokumentēta adresē http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html. Tālāk redzamā vēsturiskā konfigurācija parāda kārtulas darbību; veco spraudņa versiju nekopējiet nemainītu, bet izvēlieties pašlaik atbalstītu versiju.
<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>
Ja kārtula ir piesaistīta build procesam, nekonverģents atkarību grafs izraisa šādu kļūdu:
[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.
Bez šīs kārtulas Maven parasti saskaņo versijas un turpina darbu. Ieslēdziet to tikai tad, ja konverģence ir apzināta projekta prasība, jo dažos derīgos grafos dažādas versijas var izmantot izolēti klašu ielādētāji vai spraudņu vides.
2-2. Atkarību koka apskate
Atrisināto atkarību grafu parāda šāda komanda:
mvn dependency:tree -Dverbose
Atkarībā no spraudņa versijas detalizētā izvadē var būt atzīmēti ceļi, kas izlaisti, jo versiju saskaņošanā uzvarēja cita versija. Vēsturiskajā Windows Command Prompt piemērā šīs rindas filtrē ar komandu find:
mvn dependency:tree -Dverbose | find "omitted for conflict"
Unix tipa sistēmās izmantojiet grep vai spraudņa atbalstītos iekļaušanas un izslēgšanas filtrus. Vienmēr pārbaudiet pilno ceļu, kas ieviesis gan izvēlēto, gan izlaisto versiju.
3. Kopsavilkums
Izmantojiet dependency:tree, lai saprastu atrisināto grafu. Ja projektā nepieciešama konverģence, ieviesiet šo prasību build procesā ar aktuālu Maven Enforcer Plugin konfigurāciju. Konfliktu novērsiet apzināti — atjauninot atkarību, izmantojot dependencyManagement vai pievienojot precīzi pamatotu izslēgumu.