最佳答案
通过在 <dependency>
中声明一个 <exclusions>
元素,可以排除来自依赖项的工件,但是在这种情况下,需要排除从父项目继承的工件。以下是正在讨论的项目组的摘录:
<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
依赖于同一库的另一个版本。由于来自 ALL-DEPS
的 mail.jar
存在于执行环境中,虽然没有导出,但是与存在于父级(范围为 compile
)上的 mail.jar
发生了冲突。
一个解决方案可能是从父 POM 中去除 mail.jar,但是大多数继承基础的项目都需要它(就像 log4j 的传递依赖一样)。因此,我想做的就是简单地使用 从子项目中排除父类库,如果 base
是一个依赖项而不是父 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>
...