Les artefacts des dépendances peuvent être exclus en déclarant un élément <exclusions>
à l'intérieur d'un élément <dependency>
Mais dans ce cas, il est nécessaire d'exclure un artefact hérité d'un projet parent. Voici un extrait du POM en question :
<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
dépend de l'artefact javax.mail:mail-1.4.jar
y ALL-DEPS
dépend d'une autre version de la même bibliothèque. En raison du fait que mail.jar
de ALL-DEPS
existent dans l'environnement d'exécution, bien qu'elles ne soient pas exportées, se heurtent à l'environnement d'exécution. mail.jar
qui existe sur le parent, qui est scopé en tant que compile
.
Une solution pourrait être de supprimer mail.jar du POM parent, mais la plupart des projets qui héritent de la base en ont besoin (c'est une dépendance transitive pour log4j). Ce que j'aimerais donc faire, c'est simplement exclure la bibliothèque du parent du projet de l'enfant comme cela pourrait être le cas si base
était une dépendance et non le pom parent :
...
<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>
...