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>
baseArtefakt, hängt von einer anderen Version derselben Bibliothek ab javax.mail:mail-1.4.jarund ALL-DEPShängt von dieser ab. Aufgrund der Tatsache, dass mail.jarfrom ALL-DEPSin 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 basees 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>
...