Artefakty z zależności można wykluczyć, deklarując <exclusions>
element wewnątrz elementu a <dependency>
Ale w tym przypadku konieczne jest wykluczenie artefaktu odziedziczonego z projektu nadrzędnego. Oto fragment omawianego POM:
<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, zależy javax.mail:mail-1.4.jar
i ALL-DEPS
zależy od innej wersji tej samej biblioteki. Ze względu na fakt, że mail.jar
from ALL-DEPS
istnieje w środowisku wykonawczym, chociaż nie jest eksportowany, koliduje z tym, mail.jar
który istnieje w rodzicu, który ma zasięg jako compile
.
Rozwiązaniem mogłoby być usunięcie mail.jar z macierzystego POM, ale większość projektów, które dziedziczą base, tego potrzebuje (podobnie jak zależność transtive dla log4j). Więc chciałbym po prostu wykluczyć bibliotekę rodzica z projektu podrzędnego , tak jak można by to zrobić, gdyby base
była zależnością, a nie pom-rodzicem:
...
<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>
...