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.


$config[zx-auto] not found$config[zx-overlay] not found