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>
baseartefatto, dipende javax.mail:mail-1.4.jare ALL-DEPSdipende da un'altra versione della stessa libreria. A causa del fatto che mail.jarda ALL-DEPSesiste nell'ambiente di esecuzione, sebbene non esportato, entra in collisione con mail.jarquello 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 basefosse 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>
...