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

新手上路,请多包涵

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

“project-parent”具有 log4j 的依赖性。但我想将它从“project-child”中排除。有办法吗?

您可能会说我应该将 log4j 从“project-parent”移动到“project-child”。这是完全正确的。 但假设是我不能修改“project-parent”的 POM。

提前致谢。

原文由 Smartmarkey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

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

原文由 Adrian Shum 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不知道有什么方法可以实际排除依赖项,但您可以将其从目标分布中排除,但这有点麻烦。您需要将依赖项的范围更改为可以在最终分发中排除的内容。

所以,假设我的父母依赖于 junit 4.8,在我的 pom 中你说:

 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8</version>
    <scope>provided</scope>
</dependency>

所以我们正在将范围更改为提供。有关其工作原理的解释,请参阅我对 NoClassDefFoundError: org/junit/AfterClass during annotation processing 的回答。不幸的是,这不会影响构建,但是当您复制最终分发的依赖项时,您可以使用 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>

原文由 Matthew Farwell 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏