Os artefatos de dependências podem ser excluídos declarando um <exclusions>
elemento dentro de um <dependency>
Mas, neste caso, é necessário excluir um artefato herdado de um projeto pai. Segue um trecho do POM em discussão:
<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
artefato, depende javax.mail:mail-1.4.jar
e ALL-DEPS
depende de outra versão da mesma biblioteca. Devido ao fato mail.jar
de ALL-DEPS
existir no ambiente de execução, embora não seja exportado, colide com o mail.jar
que existe no pai, cujo escopo é o compile
.
Uma solução poderia ser livrar o mail.jar do POM pai, mas a maioria dos projetos que herdam a base precisa disso (como é uma dependência perturbadora do log4j). Então, o que eu gostaria de fazer é simplesmente excluir a biblioteca do pai do projeto filho , pois isso poderia ser feito se base
fosse uma dependência e não o pom do pai:
...
<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>
...