Gli artefatti dalle dipendenze possono essere esclusi dichiarando un <exclusions>
elemento all'interno di un <dependency>
Ma in questo caso è necessario escludere un artefatto ereditato da un progetto padre. Segue un estratto del POM in discussione:
<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
artefatto, dipende javax.mail:mail-1.4.jar
e ALL-DEPS
dipende da un'altra versione della stessa libreria. A causa del fatto che mail.jar
da ALL-DEPS
esiste nell'ambiente di esecuzione, sebbene non esportato, entra in collisione con mail.jar
quello esistente nel genitore, che ha come ambito compile
.
Una soluzione potrebbe essere quella di eliminare mail.jar dal POM genitore, ma la maggior parte dei progetti che ereditano base, ne hanno bisogno (così come una dipendenza transtiva per log4j). Quindi quello che vorrei fare è semplicemente escludere la libreria del genitore dal progetto figlio , come si potrebbe fare se base
fosse una dipendenza e non il genitore pom:
...
<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>
...