Hier ist mein allgemeines Problem:
Mein Projekt P hängt von A ab, was von B abhängt, was von C abhängt, was von Version 1.0.1 von D abhängt.
Es gibt ein Problem mit Version 1.0.1 von D und ich möchte die Verwendung eines anderen Moduls erzwingen. Ich weiß nicht, wie ich dies in den POMs meines Projekts deklarieren soll, da ich keine direkte Abhängigkeit von D hinzugefügt habe. Es ist C, das die Abhängigkeit von D erklärt.
Wichtig: In diesem Fall wird nicht nur die Version geändert, sondern auch die Gruppe und das Artefakt. Es geht also nicht nur darum, die Version der Abhängigkeit zu überschreiben, sondern ein Modul auszuschließen und ein anderes einzuschließen.
Im konkreten Fall ist D StAX, dessen 1.0.1 einen Fehler aufweist . Gemäß den Anmerkungen im Fehler "wurden die Probleme gelöst, indem stax-api-1.0.1 (maven GroupId = stax) durch stax-api-1.0-2 (maven GroupId = javax.xml.stream) ersetzt wurde", also I. Ich versuche genau das.
Somit ist D = stax: stax-api: jar: 1.0.1 und C = org.apache.xmlbeans: xmlbeans: jar: 2.3.0
Ich benutze Maven 2.0.9, falls es darauf ankommt.
Ausgabe der MVN-Abhängigkeit: Baum "
mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] | +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] | | +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] | | | \- stax:stax-api:jar:1.0.1:compile
Im POM meines Projekts habe ich die folgende Abhängigkeit von "A":
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.6</version>
</dependency>
Danke im Voraus.
quelle
Alternativ können Sie einfach die Abhängigkeit ausschließen, die Sie nicht möchten. STAX ist in JDK 1.6 enthalten. Wenn Sie also 1.6 verwenden, können Sie es einfach vollständig ausschließen.
Mein Beispiel unten ist etwas falsch für Sie - Sie brauchen nur einen der beiden Ausschlüsse, aber ich bin mir nicht ganz sicher, welcher. Es gibt andere Versionen von Stax, in meinem Beispiel unten habe ich A importiert, das B importiert hat, das C & D importiert hat, die jeweils (durch noch transitivere Abhängigkeiten) unterschiedliche Versionen von Stax importiert haben. In meiner Abhängigkeit von 'A' habe ich beide Versionen von Stax ausgeschlossen.
quelle
Ich hatte auch Probleme, eine Abhängigkeit in einer Bibliothek eines Drittanbieters zu überschreiben. Ich habe den Ansatz von scot mit dem Ausschluss verwendet, aber ich habe auch die Abhängigkeit mit der neueren Version im pom hinzugefügt. (Ich habe Maven 3.3.3 verwendet)
Für das stAX-Beispiel würde es also so aussehen:
quelle
Was Sie in das
</dependencies>
Tag des Root-Poms einfügen, wird von allen untergeordneten Modulen des Root-Poms eingeschlossen. Wenn alle Ihre Module diese Abhängigkeit verwenden, ist dies der richtige Weg.Wenn jedoch nur 3 von 10 Ihrer untergeordneten Module eine Abhängigkeit verwenden, möchten Sie nicht, dass diese Abhängigkeit in allen untergeordneten Modulen enthalten ist. In diesem Fall können Sie die Abhängigkeit einfach in das Feld einfügen
</dependencyManagement>
. Dadurch wird sichergestellt, dass jedes untergeordnete Modul, das die Abhängigkeit benötigt, diese in seiner eigenen POM-Datei deklarieren muss. Es wird jedoch dieselbe Version dieser Abhängigkeit verwendet, die in Ihrem</dependencyManagement>
Tag angegeben ist.Sie können die auch verwenden
</dependencyManagement>
, um die in transitiven Abhängigkeiten verwendete Version zu ändern, da die in der obersten POM-Datei deklarierte Version verwendet wird. Dies kann nützlich sein, wenn Ihr Projekt A ein externes Projekt B v1.0 enthält, das ein anderes externes Projekt C v1.0 enthält. Manchmal kommt es vor, dass in Projekt C v1.0 eine Sicherheitsverletzung gefunden wird, die in v1.1 korrigiert wurde. Die Entwickler von B aktualisieren ihr Projekt jedoch nur langsam, um v1.1 von C zu verwenden. In diesem Fall können Sie dies einfach deklarieren eine Abhängigkeit von C v1.1 im Root-Pom Ihres Projekts in `, und alles wird gut (vorausgesetzt, B v1.0 kann weiterhin mit C v1.1 kompiliert werden).quelle
Die akzeptierte Antwort ist richtig, aber ich möchte meine zwei Cent hinzufügen. Ich bin auf ein Problem gestoßen, bei dem ich ein Projekt A hatte, das ein Projekt B als Abhängigkeit hatte. Beide Projekte verwenden slf4j, aber Projekt B verwendet log4j, während Projekt A logback verwendet. Projekt B verwendet slf4j 1.6.1, während Projekt A slf4j 1.7.5 verwendet (aufgrund der bereits enthaltenen Abhängigkeit von Logback 1.2.3).
Das Problem: Projekt A konnte keine Funktion finden, die in slf4j 1.7.5 vorhanden ist. Nachdem ich die Registerkarte "Abhängigkeitshierarchie" von eclipe überprüft hatte, stellte ich fest, dass während der Erstellung slf4j 1.6.1 aus Projekt B anstelle von slf4j 1.7.5 von logback verwendet wurde .
Ich habe das Problem gelöst, indem ich die Reihenfolge der Abhängigkeiten von Projekt A pom geändert habe. Als ich den Eintrag für Projekt B unter den Logback-Eintrag verschoben habe, hat maven begonnen, das Projekt mit slf4j 1.7.5 zu erstellen.
Bearbeiten: Hinzufügen der Abhängigkeit slf4j 1.7.5, bevor die Abhängigkeit von Projekt B ebenfalls funktioniert hat.
quelle