Artefakte aus Abhängigkeiten können ausgeschlossen werden, indem ein <exclusions>
Element in a deklariert wird. <dependency>
In diesem Fall muss jedoch ein von einem übergeordneten Projekt geerbtes Artefakt ausgeschlossen werden. Ein Auszug des zur Diskussion stehenden POM folgt:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
Artefakt, hängt von einer anderen Version derselben Bibliothek ab javax.mail:mail-1.4.jar
und ALL-DEPS
hängt von dieser ab. Aufgrund der Tatsache, dass mail.jar
from ALL-DEPS
in der Ausführungsumgebung vorhanden ist, obwohl es nicht exportiert wird, kollidiert es mit dem mail.jar
, das auf dem übergeordneten Element vorhanden ist, für das der Gültigkeitsbereich gilt compile
.
Eine Lösung könnte darin bestehen, mail.jar vom übergeordneten POM zu entfernen, aber die meisten Projekte, die base erben, benötigen es (wie es eine transtive Abhängigkeit für log4j ist). Ich möchte also einfach die Bibliothek der Eltern aus dem untergeordneten Projekt ausschließen , wie dies möglich wäre, wenn base
es sich um eine Abhängigkeit und nicht um die übergeordnete POM handelt:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Sie können Ihre Abhängigkeiten innerhalb eines anderen Projekts mit einer Verpackung
pom
gruppieren, wie in den Best Practices von Sonatypes beschrieben :und referenziere sie von deinem Eltern-Pom (beachte die Abhängigkeit
<type>pom</type>
):Ihr Kind-Projekt erbt dieses Eltern-Pom wie zuvor. Jetzt kann die Mail-Abhängigkeit im untergeordneten Projekt innerhalb des
dependencyManagement
Blocks ausgeschlossen werden:quelle
Verwenden Sie keinen Eltern-Pom
Das mag extrem klingen, aber auf die gleiche Weise ist "Vererbungshölle" ein Grund, warum manche Leute der objektorientierten Programmierung den Rücken kehren (oder die Komposition der Vererbung vorziehen ), den problematischen
<parent>
Block entfernen und alles kopieren und einfügen, was<dependencies>
Sie brauchen (wenn Ihr Team es Ihnen gibt diese Freiheit).Die Annahme, dass die Aufteilung von Poms in Eltern und Kind zur "Wiederverwendung" und "Vermeidung von Redunanz" ignoriert werden sollte und Sie zuerst Ihre unmittelbaren Bedürfnisse befriedigen sollten (die Heilung ist schlimmer als die Krankheit). Außerdem hat Redundanz ihre Vorteile - nämlich die Unabhängigkeit von externen Änderungen (dh Stabilität).
Dies ist einfacher als es sich anhört, wenn Sie den effektiven POM generieren (Eclipse bietet ihn an, aber Sie können ihn über die Befehlszeile mit generieren
mvn help:effective
).Beispiel
Ich möchte
logback
als slf4j-Bindung verwenden, aber mein übergeordnetes pom enthält dielog4j
Abhängigkeit. Ich möchte nicht gehen und die Abhängigkeit der anderen Kinder von log4j in ihre eigenenpom.xml
Dateien verschieben müssen, damit meine nicht behindert werden.quelle
Definieren Sie die Abhängigkeit (im untergeordneten POM)
scope
neu, indem das System auf ein leeres Glas zeigt:Das Glas kann nur eine einzige leere Datei enthalten:
quelle
notepad empty.class
dannjar cvf empty.jar empty.class
ein leeres Glas zu erzeugen.Haben Sie versucht, die gewünschte Version von mail.jar explizit zu deklarieren? Die Abhängigkeitsauflösung von Maven sollte dies für die Abhängigkeitsauflösung gegenüber allen anderen Versionen verwenden.
quelle
Am besten machen Sie die Abhängigkeiten, die Sie nicht immer erben möchten, intransitiv.
Sie können dies tun, indem Sie sie im übergeordneten POM mit dem bereitgestellten Bereich markieren.
Wenn das übergeordnete Element weiterhin Versionen dieser Deps verwalten soll, können Sie mit dem
<dependencyManagement>
Tag die gewünschten Versionen einrichten, ohne sie explizit zu erben oder diese Vererbung an untergeordnete Elemente weiterzugeben .quelle
Wenn Sie ein Paket aufrufen, aber einige seiner Abhängigkeiten nicht möchten, können Sie Folgendes tun (in diesem Fall wollte ich nicht, dass das alte log4j hinzugefügt wird, weil ich das neuere verwenden musste):
Das funktioniert bei mir ... aber ich bin ziemlich neu in Java / Maven, also ist es vielleicht nicht optimal.
quelle
Ich musste wirklich dieses schmutzige Ding machen ... Hier ist wie
Ich habe diese Abhängigkeiten mit Umfang neu definiert
test
. Scopeprovided
hat bei mir nicht funktioniert.Wir verwenden das Spring Boot Plugin, um ein dickes Glas zu bauen. Wir haben ein gemeinsames Modul , das allgemeine Bibliotheken definiert, zum Beispiel Springfox swagger-2. Mein Super-Service muss gemeinsame Eltern haben (das will er nicht, aber die Unternehmensregeln erzwingen!)
Also hat mein Elternteil oder Commons Pom.
Und mein Super-Service- Pom.
Dies ist die Größe des endgültigen Fettartefakts
Auch diese Antwort ist erwähnenswert - ich wollte es tun, aber ich bin faul ... https://stackoverflow.com/a/48103554/4587961
quelle
Wir können das übergeordnete pom als Abhängigkeit vom Typ pom hinzufügen und davon ausschließen. Weil sowieso Eltern-POM heruntergeladen wird. Das hat bei mir funktioniert
quelle