Los artefactos de las dependencias se pueden excluir declarando un <exclusions>
elemento dentro de un <dependency>
Pero en este caso es necesario excluir un artefacto heredado de un proyecto principal. A continuación, se muestra un extracto del POM en discusión:
<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
artefacto, depende javax.mail:mail-1.4.jar
y ALL-DEPS
depende de otra versión de la misma biblioteca. Debido al hecho de que mail.jar
desde ALL-DEPS
existe en el entorno de ejecución, aunque no se exporta, choca con el mail.jar
que existe en el padre, que tiene el alcance compile
.
Una solución podría ser eliminar mail.jar del POM principal, pero la mayoría de los proyectos que heredan la base la necesitan (como es una dependencia transtiva para log4j). Entonces, lo que me gustaría hacer es simplemente excluir la biblioteca principal del proyecto secundario , ya que se podría hacer si base
fuera una dependencia y no el pom principal:
...
<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>
...