如何在Maven中从父项目中排除依赖项?
例如,我有2个Maven项目。一个是“项目父级”。另一个是“项目子级”。显然,“项目子项”是“项目父项”的子项。
“project-parent” 具有 log4j 的依赖项。但我想把它从“项目子”中排除。有没有办法?
你可能会说我应该将log4j从“项目父”移动到“项目子”。这是完全正确的。但假设是我不能修改“项目父”的POM。
提前致谢。
例如,我有2个Maven项目。一个是“项目父级”。另一个是“项目子级”。显然,“项目子项”是“项目父项”的子项。
“project-parent” 具有 log4j 的依赖项。但我想把它从“项目子”中排除。有没有办法?
你可能会说我应该将log4j从“项目父”移动到“项目子”。这是完全正确的。但假设是我不能修改“项目父”的POM。
提前致谢。
我认为在Maven2中没有办法实现这一点,因为这就是POM继承的目的。但是,我能想到一个技巧:
假设您有权将工件上传到内部工件存储库。您可以创建一个空的JAR,将其部署为log4j:log4j,具有明显异常的版本(例如log4j:log4j:9999)。在项目子级中添加此类依赖项。然后,它将覆盖父级的依赖关系,以依赖于事实上为空的JAR。
我不知道有没有办法真正排除依赖关系,但你可以从目标发行版中排除它,但这有点黑客攻击。您需要将依赖项的范围更改为可以在最终分发中排除的内容。
所以,假设我的父母依赖于junit 4.8,在我的pom中你说:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>provided</scope>
</dependency>
因此,我们将范围更改为提供。有关其工作原理的解释,请参阅我对NoClassDefFoundError的回答:在注释处理期间组织/junit/AfterClass。遗憾的是,这不会影响构建,但是当您复制最终发行版的依赖项时,可以使用配置元素不将依赖项复制到最终分发中:excludeScope
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-libs</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeScope>provided</excludeScope>
</configuration>
</execution>