Maven3排除了从父pom继承的不必要的依赖关系



嗨,这就是我想要实现的:在一个更大的项目中,单独发布其中一个模块,其中包含该模块所需的所有依赖项,而不是从其父模块继承的所有依赖项。

为了实现这一点,我把include放在发布模块的汇编插件中,它排除了所有不在include中的东西。

请让我们知道这是实践还是黑客?如果更有意义的话,我会接受另一种解决方案,但是会有一个父节点并且父节点会有很多其他与这个模块无关的依赖项,否则告诉我们是否不应该将依赖项放在父节点中而是放在单独的模块节点

则告诉我们是否不应该将依赖项放在父组件组件中,而是放在单独的模块组件中

我的建议与此类似。父POM中的依赖应该主要由继承的项目使用。你不应该盲目地把所有可能的依赖都放在父母身上。它破坏了依赖管理机制。

然而,就我个人而言,我通常把所有可能的依赖关系作为dependencyManagement放在父POM中(通常当我有一个稍大的项目时,我把它变成多模块,其中一个模块是项目的父模块)。这有助于避免同一项目的各个模块定义相同依赖的不同版本。通过这样做,每个模块(在大多数情况下)只声明它所需要的依赖项的组ID和工件ID。(我希望你把每个依赖项放在parent中的原因是相关的)

关于管理父POM中依赖关系的更多信息


更新:回答OP在评论中的问题:

谢谢你的建议。我想家长POM可以被清理一下。但是,如果不必要的依赖来自第三方库,而我们并不真正需要/想要(因为不同的版本?),但只是其中的一些呢?

那完全是另一回事。在某些情况下,我们希望控制如何传递地查找依赖项。下面是一些你想知道的技巧:

当你声明依赖时,你可以声明排除,这样它就排除了一些可传递的依赖,像这样:

<dependency>
    <groupId>foo</groupId>
    <artifactId>foo-core</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>bar</group>
            <artifactId>bar-dep</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用dependencyManagement的优点之一是,如果您将上述内容作为dependencyManagement放在父POM中,当几个模块需要使用foo:foo-core时,它们只需声明groupId和artifactId,而无需重复那些冗长的排除

另一种方式是,例如,在上面的例子中,您仍然需要bar:bar-dep,只是您需要一个与传递查找的版本不同的版本,然后您可以简单地在POM中声明您想要的正确版本,Maven将使用"最接近"的版本,如这里所述

还有其他通过依赖空依赖项来排除的技巧,如注释中所述

最新更新