Hogyan oldhatjuk meg a műtárgyak verziós ütközését Mavenben
1. Áttekintés
A több modulos Maven projektek összetett függőségi grafikonokkal rendelkezhetnek. Ezeknek szokatlan eredményei lehetnek, annál inkább importálják a modulok egymást.
Ebben az oktatóanyagban megtudjuk, hogyan kell megoldani a műtárgyak Maven-beli ütközését.
Kezdünk egy több modulos projekttel, ahol szándékosan használtuk ugyanazon műtárgy különböző verzióit. Ezután megtudjuk, hogyan lehet megakadályozni egy műtárgy rossz verziójának megszerzését a kizárás vagy a függőség kezelésével.
Végül megpróbáljuk használni a m-etaven-enforcer-plugin a dolgok könnyebb irányítása érdekében, a transzitív függőségek használatának betiltásával.
2. A műtárgyak verziójának ütközése
Minden függőség, amelyet a projektünkbe belefoglalunk, más tárgyakhoz kapcsolódhat. Maven automatikusan behozhatja ezeket a tárgyakat, más néven transzitív függőségeket. A verzióütközés akkor következik be, amikor több függőség kapcsolódik ugyanahhoz a tárgyhoz, de különböző verziókat használnak.
Ennek eredményeként hibák fordulhatnak elő alkalmazásainkban mind az összeállítási szakaszban, mind a futás közben.
2.1. Projekt felépítése
Definiáljunk egy több modulos projektstruktúrát, amellyel kísérletezni lehet. Projektünk a verzió-ütközés szülő és három gyermek modul:
verzió-ütközés projekt-egy projekt-b projekt-ütközés
A pom.xml mert projekt-a és projekt-b szinte azonosak. Az egyetlen különbség a com.google.guava műtárgy, amelytől függenek. Különösen, projekt-a verziót használ 22.0:
com.google.guava guava 22.0
De, projekt-b az újabb verziót használja, 29,0 jre:
com.google.guava guava 29.0-jre
A harmadik modul, projekt-ütközés, a másik kettőtől függ:
com.baeldung project-a 0.0.1-SNAPSHOT com.baeldung project-b 0.0.1-SNAPSHOT
Szóval, melyik verzió gujávafa számára elérhető lesz projekt-ütközés?
2.2. A Specific Dependency Version funkcióinak használata
Megtudhatjuk, hogy mely függőséget használjuk, ha egyszerű tesztet hozunk létre a projekt-ütközés modul, amely a Futures.immediateVoidFuture módszer től gujávafa:
@Test public void whenVersionCollisionDoesNotExist_thenShouldCompile () {assertThat (Futures.immediateVoidFuture (), notNullValue ()); }
Ez a módszer csak a 29,0 jre változat. Ezt örököltük a többi modul egyikéből, de a kódunkat csak akkor állíthatjuk össze, ha a tranzitív függőséget projekt-b.
2.3. A verzióütközés okozta fordítási hiba
A függőségek sorrendjétől függően a projekt-ütközés modul, bizonyos kombinációkban a Maven fordítási hibát ad vissza:
[ERROR] Nem sikerült végrehajtani a cél org.apache.maven.plugins: maven-compiler-plugin: 3.8.1: testCompile (default-testCompile) projekt projekt-ütközés esetén: Összeállítási hiba [ERROR] / oktatóanyagok / maven-all / verzió -collision / project-collision / src / test / java / com / baeldung / version / collision / VersionCollisionUnitTest.java: [12,27] nem találja a szimbólumot [ERROR] szimbólum: method instantVoidFuture () [ERROR] hely: class com. google.common.util.concurrent.Futures
Ez a verzió ütközésének eredménye com.google.guava műalkotás. Alapértelmezés szerint egy függőségi fa azonos szintű függőségei esetén Maven kiválasztja az első könyvtárat, amelyet megtalált. Esetünkben mindkettő com.google.guava a függőségek azonos magasságban vannak, és a régebbi verziót választják.
2.4. Használata maven-dependency-plugin
A maven-dependency-plugin nagyon hasznos eszköz az összes függőség és azok verzióinak bemutatására:
% mvn függőség: fa -Dverbose [INFO] --- maven-dependency-plugin: 2.8: fa (alapértelmezett-cli) @ project-collision --- [INFO] com.baeldung: project-collision: jar: 0.0.1 -SNAPSHOT [INFO] + - com.baeldung: project-a: jar: 0.0.1-SNAPSHOT: fordítás [INFO] | \ - com.google.guava: guava: jar: 22.0: compile [INFO] \ - com.baeldung: project-b: jar: 0.0.1-SNAPSHOT: compile [INFO] \ - (com.google.guava: guava : jar: 29.0-jre: compile - kihagyva a 22.0-val való ütközés miatt)
A -Dverbose flag jelzi az ütköző tárgyakat. Valójában van egy com.google.guava függőség két változatban: 22.0 és 29.0-jre. Ez utóbbit szeretnénk használni a projekt-ütközés modul.
3. Tranzitív függőség kizárása egy műtárgyból
A verzióütközés egyik módja a az ütköző transzitív függőség eltávolítása meghatározott műtárgyakból. Példánkban nem akarjuk, hogy a com.google.guava könyvtár átmenetileg hozzáadva a projekt-a műalkotás.
Ezért kizárhatjuk a projekt-ütközés pom:
com.baeldung project-a 0.0.1-SNAPSHOT com.google.guava guava com.baeldung project-b 0.0.1-SNAPSHOT
Most, amikor lefuttatjuk a függőség: fa parancsot láthatjuk, hogy már nincs ott:
% mvn függőség: fa -Dverbose [INFO] --- maven-dependency-plugin: 2.8: fa (alapértelmezett-cli) @ project-collision --- [INFO] com.baeldung: project-collision: jar: 0.0.1 -SNAPSHOT [INFO] \ - com.baeldung: project-b: jar: 0.0.1-SNAPSHOT: compile [INFO] \ - com.google.guava: guava: jar: 29.0-jre: compile
Ennek eredményeként az összeállítási szakasz hiba nélkül zárul le, és az osztályokat és módszereket verziótól kezdve használhatjuk 29,0 jre.
4. A függőségMenedzsment Szakasz
Mavené függőségMenedzsment szakasz egy mechanizmus a függőségi információk központosítására. Az egyik leghasznosabb tulajdonsága a tranzitív függőségként használt artefaktumok verzióinak vezérlése.
Ezt szem előtt tartva hozzunk létre egy függőségMenedzsment konfiguráció a szülőnkben pom:
com.google.guava guava 29.0-jre
Ennek eredményeként Maven gondoskodik a verzió használatáról 29,0 jre nak,-nek com.google.guava műtárgy az összes gyermekmodulban:
% mvn függőség: fa -Dverbose [INFO] --- maven-dependency-plugin: 2.8: fa (alapértelmezett-cli) @ project-collision --- [INFO] com.baeldung: project-collision: jar: 0.0.1 -SNAPSHOT [INFO] + - com.baeldung: project-a: jar: 0.0.1-SNAPSHOT: fordítás [INFO] | \ - com.google.guava: guava: jar: 29.0-jre: compile (22.0-tól kezelt verzió) [INFO] \ - com.baeldung: project-b: jar: 0.0.1-SNAPSHOT: compile [INFO] \ - (com.google.guava: guava: jar: 29.0-jre: compile - 22.0-tól kezelt verzió; duplikátum nélkül kihagyva)
5. A véletlen tranzitív függőségek megelőzése
A maven-enforcer-plugin sok beépített szabályt nyújt, amelyek egyszerűsítse a több modulos projekt kezelését. Egyikük megtiltja az osztályok és módszerek alkalmazását a transzitív függőségektől.
A kifejezett függőségi nyilatkozat kiküszöböli a műtárgyak verzióütközésének lehetőségét. Tegyük hozzá a maven-enforcer-plugin ezzel a szabálysal a szülő pomunkra:
org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 kényszerít-betiltott-függőségek kényszerít
Ennek következtében most kifejezetten ki kell jelentenünk a com.google.guava műtárgy a mi projekt-ütközés modul, ha magunk akarjuk használni. Vagy meg kell adnunk a használni kívánt verziót, vagy be kell állítanunk függőségMenedzsment a szülőben pom.xml. Ez a projektünket hibabiztosabbá teszi, de megköveteli, hogy egyértelműbbek legyünk a projektben pom.xml fájlokat.
6. Következtetés
Ebben a cikkben megtudtuk, hogyan lehet megoldani a műtárgyak Maven-beli verzióütközését.
Először egy több modulból álló projekt verziójának ütközését vizsgáltuk.
Ezután megmutattuk, hogyan lehet kizárni a tranzitív függőségeket a pom.xml. Megvizsgáltuk, hogyan lehet a függőségi verziókat vezérelni a függőségMenedzsment szakasz a szülőben pom.xml.
Végül kipróbáltuk a maven-enforcer-plugin megtiltani a tranzitív függőségek használatát annak érdekében, hogy az egyes modulokat a saját irányításának kényszerítésére kényszerítsék.
Mint mindig, az ebben a cikkben bemutatott kód elérhető a GitHubon.