如何在Maven中从父项目中排除依赖项?

2022-09-01 02:42:57

例如,我有2个Maven项目。一个是“项目父级”。另一个是“项目子级”。显然,“项目子项”是“项目父项”的子项。

“project-parent” 具有 log4j 的依赖项。但我想把它从“项目子”中排除。有没有办法?

你可能会说我应该将log4j从“项目父”移动到“项目子”。这是完全正确的。但假设是我不能修改“项目父”的POM。

提前致谢。


答案 1

我认为在Maven2中没有办法实现这一点,因为这就是POM继承的目的。但是,我能想到一个技巧:

假设您有权将工件上传到内部工件存储库。您可以创建一个空的JAR,将其部署为log4j:log4j,具有明显异常的版本(例如log4j:log4j:9999)。在项目子级中添加此类依赖项。然后,它将覆盖父级的依赖关系,以依赖于事实上为空的JAR。


答案 2

我不知道有没有办法真正排除依赖关系,但你可以从目标发行版中排除它,但这有点黑客攻击。您需要将依赖项的范围更改为可以在最终分发中排除的内容。

所以,假设我的父母依赖于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>

推荐