Maven priklausomybių konfliktų diagnostika naudojant dependency:tree
Paskelbimo data:
Atnaujinta:
Techniniai straipsniai > Maven priklausomybių konfliktų diagnostika naudojant dependency:tree
2026 m. būsena ir saugus naudojimas
Trumpai: paleiskite mvn dependency:tree, peržiūrėkite faktiškai išspręstą grafą ir nustatykite, kuriame kelyje atsirado netikėta versija. Deklaraciją taisykite sąmoningai: atnaujinkite tiesioginę priklausomybę, naudokite dependencyManagement arba pridėkite tik aiškiai pagrįstą išskyrimą.
Ką išmoksite
- Kaip „artimiausio apibrėžimo“ taisyklė gali paslėpti tranzityviai prašomą versiją.
- Kaip išsami ir filtruota priklausomybių medžio išvestis padeda nustatyti konflikto šaltinį.
- Kodėl vietinės repozitorijos failų ištrynimas arba atsitiktinių išskyrimų pridėjimas nėra ilgalaikis sprendimas.
Kam skirtas straipsnis: „Java“ kūrėjams, tiriantiems susiejimo klaidas, netikėtas klases arba pažeidžiamas tranzityvių priklausomybių versijas.
2026 m. kontekstas: papildinio parinktys priklauso nuo versijos, todėl tikrinkite dabartinę „Maven Dependency Plugin“ dokumentaciją. Grafo peržiūrą derinkite su organizacijoje patvirtinta programinės įrangos sudėties analize; tvarkingas priklausomybių medis savaime neįrodo, kad priklausomybė saugi.
Saugos pastaba: pradinio straipsnio komandos ir konfigūracijos pavyzdžiai nebuvo iš naujo išbandyti dabartinėje produkcinėje aplinkoje. Prieš juos taikydami atskiroje bandymo aplinkoje patikrinkite palaikomas versijas, atsargines kopijas, prieigos kontrolę ir grįžimo prie ankstesnės būsenos veiksmus.
Pagrindiniai oficialūs šaltiniai
Apžvalga
Spręsdamas priklausomybių grafą „Maven“ suderina skirtinguose keliuose prašomas to paties artefakto versijas. Dėl to viename kelyje nurodyta versija gali likti nepanaudota. Toliau parodoma, kaip peržiūrėti galutinį rezultatą ir, kai projektui to reikia, užtikrinti priklausomybių konvergenciją.
Turinys
1. Kai „Maven“ priklausomybės prašo skirtingų versijų
„Maven“ išsprendžia tiesiogines ir tranzityvias priklausomybes, o kai skirtinguose grafo keliuose prašoma nevienodų to paties artefakto versijų, pritaiko versijų derinimo taisykles. Pagrindinė repozitorijų ir POM veikimo seka aprašyta susijusiame straipsnyje.
Kaip „Maven“ sprendžia tranzityvias priklausomybes
Sėkmingas build procesas neįrodo, kad pasirinkta kiekviena priklausomybių deklaruota versija. Tiriant susiejimo klaidas, netikėtą elgesį ar pažeidžiamą tranzityvią priklausomybę reikia peržiūrėti faktiškai išspręstą grafą.
2. Kaip patikrinti
Naudingi du vienas kitą papildantys patikrinimai:
- prireikus sustabdyti build procesą, kai priklausomybės nekonverguoja;
- peržiūrėti išspręstą grafą naudojant priklausomybių papildinį.
Pirmąjį patikrinimą galima nuosekliai kartoti CI aplinkoje. Antrasis yra interaktyvi diagnostika, parodanti, kodėl „Maven“ pasirinko konkrečią versiją.
2-1. Priklausomybių konvergencijos tikrinimas
„Maven Enforcer Plugin“ pateikia taisyklę dependencyConvergence. Toliau parodyta istorinė konfigūracija; nekopijuokite senos papildinio versijos jos nepatikrinę ir rinkitės dabartinę palaikomą versiją.
http://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html
Susiejus taisyklę su build procesu, nekonverguojantis grafas sukelia panašią klaidą:
<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>
Ši klaida parodo du kelius, kuriais pasiekiamos skirtingos to paties artefakto versijos.
[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.
Be tokios taisyklės „Maven“ paprastai suderina versijas ir tęsia build procesą. Taisyklę įjunkite tik tada, kai konvergencija yra sąmoninga projekto politika, nes kai kuriuose tinkamuose grafuose kelios versijos gali būti izoliuotos skirtingose klasių įkėlimo ar papildinių aplinkose.
2-2. Priklausomybių medžio peržiūra
Faktiškai išspręstą priklausomybių grafą parodykite šia komanda:
mvn dependency:tree -Dverbose
Priklausomai nuo papildinio versijos, išsamioje išvestyje gali būti pažymėti keliai, atmesti dėl to, kad derinant versijas pasirinktas kitas kelias. Toliau pateiktame istoriniame „Windows Command Prompt“ pavyzdyje tokios eilutės filtruojamos komanda find:
mvn dependency:tree -Dverbose | find "omitted for conflict"
„Unix“ tipo sistemose naudokite grep arba papildinio palaikomus įtraukimo ir atmetimo filtrus. Visada peržiūrėkite visą kelią, kuriuo atsirado pasirinkta ir atmesta versijos.
3. Išvada
Komanda dependency:tree padeda suprasti faktiškai išspręstą grafą. Jei projektui būtina priklausomybių konvergencija, įtvirtinkite šią politiką build procese naudodami dabartinę „Maven Enforcer Plugin“ versiją. Konfliktą spręskite sąmoningai: atnaujinkite priklausomybę, naudokite dependencyManagement arba pridėkite tik aiškiai pagrįstą išskyrimą.
Techniniai straipsniai
Peržiūrėkite visus techninius straipsnius.
Profilis
Peržiūrėkite autoriaus profilį.
Kontaktai