In Maven2 muss ich Folgendes tun, um eine einzelne transitive Abhängigkeit auszuschließen:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
Das Problem bei diesem Ansatz ist, dass ich dies für jede transitive Abhängigkeit tun muss, die von beigetragen wird sample-artifactB
.
Gibt es eine Möglichkeit, eine Art Platzhalter zu verwenden, um alle transitiven Abhängigkeiten auf einmal anstatt einzeln auszuschließen?
maven-2
dependencies
pbreault
quelle
quelle
Antworten:
Für maven2 gibt es keine Möglichkeit, das zu tun, was Sie beschreiben. Für Maven 3 gibt es. Wenn Sie Maven 3 verwenden, sehen Sie bitte eine andere Antwort auf diese Frage
Für Maven 2 würde ich empfehlen, einen eigenen benutzerdefinierten POM für die Abhängigkeit zu erstellen, die Ihre <Ausschlüsse> enthält. Stellen Sie für Projekte, die diese Abhängigkeit verwenden müssen, die Abhängigkeit auf Ihr benutzerdefiniertes POM anstelle des typischen Artefakts ein. Dadurch können Sie zwar nicht unbedingt alle transitiven Abhängigkeiten mit einem einzigen <Ausschluss> ausschließen, aber Sie müssen Ihre Abhängigkeit nur einmal schreiben, und alle Ihre Projekte müssen keine unnötigen und langen Ausschlusslisten führen.
quelle
Was für mich funktioniert hat (möglicherweise eine neuere Funktion von Maven), ist lediglich das Platzieren von Platzhaltern im Ausschlusselement.
Ich habe ein Projekt mit mehreren Modulen, das ein "App" -Modul enthält, auf das in zwei WAR-Paketen verwiesen wird. Eines dieser WAR-gepackten Module benötigt wirklich nur die Domänenklassen (und ich habe sie noch nicht vom App-Modul getrennt). Ich fand das funktioniert:
Der Platzhalter sowohl für die Gruppen-ID als auch für die Artefakt-ID schließt alle Abhängigkeiten aus, die normalerweise mit dieser Abhängigkeit an das Modul weitergegeben werden.
quelle
Eine Sache habe ich nützlich gefunden:
Wenn Sie die Abhängigkeit mit den Ausschlüssen im Abschnitt dependencyManagement des übergeordneten POM für Ihr Projekt oder in einem importierbaren POM für das Abhängigkeitsmanagement einfügen, müssen Sie den Ausschluss (oder die Version) nicht wiederholen.
Zum Beispiel, wenn Ihr übergeordnetes POM Folgendes hat:
Dann können die Module in Ihrem Projekt die Abhängigkeit einfach wie folgt deklarieren:
Das im übergeordneten POM gibt sowohl die Version als auch die Ausschlüsse an. Ich verwende diese Technik für fast alle unsere Projekte und sie eliminiert viele Wiederholungen.
quelle
Vor drei Jahren habe ich empfohlen, Version 99 nicht zu verwenden, aber jetzt habe ich einen besseren Weg gefunden, zumal Version 99 offline ist:
Verwenden Sie im übergeordneten POM Ihres Projekts das Maven-Enforcer-Plugin, um den Build fehlzuschlagen , wenn sich die unerwünschte Abhängigkeit in den Build einschleicht. Dies kann mithilfe der Regel für gesperrte Abhängigkeiten des Plugins erfolgen :
Wenn Sie dann über eine unerwünschte Abhängigkeit informiert werden, schließen Sie diese im
<dependencyManagement>
Abschnitt des übergeordneten POM aus :Auf diese Weise wird die unerwünschte Abhängigkeit nicht versehentlich angezeigt (im Gegensatz zu einer,
<exclusion>
die leicht zu vergessen ist), sie ist auch während der Kompilierungszeit nicht verfügbar (im Gegensatz zumprovided
Gültigkeitsbereich), es gibt keine falschen Abhängigkeiten (im Gegensatz zu Version 99) und es ' Ich arbeite ohne ein benutzerdefiniertes Repository (im Gegensatz zu Version 99). Dieser Ansatz funktioniert sogar basierend auf der Version, den Klassifizierern, dem Bereich oder einer ganzen Gruppen-ID des Artefakts. Weitere Informationen finden Sie in der Dokumentation .quelle
<configuration>
beim Ausführen des Ziels über die Befehlszeile ignoriert wird und direkt unter verschoben werden muss<plugin>
.<dependencyManagement>
Bereich ausschließe. Wenn Sie einmvn dependency:tree
in diesem bestimmten Projekt ausführen, wird die Abhängigkeit überhaupt nicht ausgeschlossen. Aber alle Projekte, die diese Abhängigkeit importieren, werden den<exclusions>
vom anderen Projekt übergeordneten Pom nicht berücksichtigen - der ausgeschlossene wird sich einschleichen !!! Ich musste<exclusions>
direkt zu jedem Modul pom wechseln .Ich verwende die folgende Problemumgehung: Anstatt zu versuchen, das Artefakt in allen geeigneten Abhängigkeiten auszuschließen, zeichne ich die Abhängigkeit auf oberster Ebene als "bereitgestellt". Um beispielsweise den Versand von xml-apis "welcher Version auch immer" zu vermeiden:
quelle
Derzeit gibt es keine Möglichkeit, mehr als eine transitive Abhängigkeit gleichzeitig auszuschließen. Auf der Maven JIRA-Site gibt es jedoch eine entsprechende Funktionsanforderung:
https://issues.apache.org/jira/browse/MNG-2315
quelle
Hierfür gibt es eine Problemumgehung. Wenn Sie den Umfang einer Abhängigkeit auf Laufzeit festlegen , werden transitive Abhängigkeiten ausgeschlossen. Beachten Sie jedoch, dass Sie zusätzliche Verarbeitung hinzufügen müssen, wenn Sie die Laufzeitabhängigkeit packen möchten.
Um die Laufzeitabhängigkeit in ein beliebiges Paket aufzunehmen, können Sie das Kopierziel des Maven-Dependency-Plugins für ein bestimmtes Artefakt verwenden .
quelle
<scope>provided</scope>
stattdessen verwenden<scope>runtime</scope>
.Wenn Sie alle transitiven Abhängigkeiten von einem Abhängigkeitsartefakt ausschließen müssen, das Sie in eine Assembly aufnehmen möchten, können Sie dies im Deskriptor für das Assembly-Plugin angeben:
quelle
Wenn Sie unter Eclipse entwickeln, können Sie im Abhängigkeitsdiagramm des POM-Editors (erweiterte Registerkarten aktiviert) nach der Abhängigkeit suchen, die Sie von Ihrem Projekt ausschließen möchten, und dann:
Klicken Sie mit der rechten Maustaste darauf -> "Maven-Artefakt ausschließen ..." und Eclipse schließt den Ausschluss für Sie aus, ohne herausfinden zu müssen, mit welcher Abhängigkeit die Bibliothek verknüpft ist.
quelle
Was ist Ihr Grund, alle transitiven Abhängigkeiten auszuschließen?
Wenn es ein bestimmtes Artefakt gibt (z. B. Commons-Logging), das Sie von jeder Abhängigkeit ausschließen müssen, kann der Ansatz Version 99 nicht vorhanden hilfreich sein.
Update 2012: Verwenden Sie diesen Ansatz nicht. Verwenden Sie das Maven-Enforcer-Plugin und Ausschlüsse . Version 99 erzeugt falsche Abhängigkeiten und das Repository von Version 99 ist offline (es gibt ähnliche Spiegel, aber Sie können sich nicht darauf verlassen, dass sie für immer online bleiben; es ist am besten, nur Maven Central zu verwenden).
quelle
In einem ähnlichen Problem wurde die gewünschte Abhängigkeit mit dem angegebenen Umfang deklariert. Bei diesem Ansatz werden die transitiven Abhängigkeiten abgerufen, aber NICHT in die Paketphase einbezogen, was Sie möchten. Ich mag diese Lösung auch in Bezug auf die Wartung, da für die Wartung kein Pom oder benutzerdefinierter Pom wie in der Whaley-Lösung erforderlich ist. Sie müssen nur die spezifische Abhängigkeit im Container angeben und fertig sein
quelle
Verwenden Sie den neuesten Maven in Ihrem Klassenpfad. Dadurch werden doppelte Artefakte entfernt und das neueste Maven-Artefakt beibehalten.
quelle