Артефакты из зависимостей можно исключить, объявив элемент <exclusions>
внутри <dependency>
Но в этом случае ему нужно было исключить артефакт, унаследованный от родительского проекта. Ниже приводится выдержка из POM:
<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
артефакт, зависит от javax.mail:mail-1.4.jar
, а ALL-DEPS
зависит от другой версии той же библиотеки. Из-за того, что mail.jar
из ALL-DEPS
существует в среде выполнения, хотя и не экспортирован, сталкивается с mail.jar
который существует в родительском mail.jar
, который используется как compile
.
Решение может состоять в том, чтобы избавиться от mail.jar от родительского POM, но для большинства проектов, которые наследуют базу, это нужно (как и зависимость от transtive для log4j). Итак, я хотел бы просто исключить родительскую библиотеку из дочернего проекта, поскольку это можно сделать, если base
была зависимой, а не родительской помпой:
...
<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>
...