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>
...