Maven3排除了从父pom继承的不必要的依赖关系以进行分发?

时间:2015-06-02 01:50:21

标签: java maven distribution maven-assembly-plugin

嗨,这就是我想要实现的目标: 使用该模块所需的所有依赖项自行分发较大项目的其中一个模块,而不是从其父pom继承的所有依赖项。

为了实现这一目标,我将包含在分发模块的程序集插件中,该插件排除了包含内的所有其他内容。

如果这是练习或黑客,请告诉我们?如果更有意义,会接受一个不同的解决方案,但是会有一个父pom,而父pom会有很多与此模块无关的其他依赖项,否则告诉我们是否应该将依赖项放在父pom中而是放入他们在个别模块poms

1 个答案:

答案 0 :(得分:1)

  

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

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

但是,我个人通常会将所有可能的依赖项放在父POM中作为dependencyManagement(通常当我有一个更大的项目时,我将其设置为多模块,其中一个模块是项目的父模块) 。这有助于避免同一项目的单个模块定义相同依赖项的不同版本。通过这样做,每个模块(在大多数情况下)仅声明它所需的依赖关系的组ID和工件ID。 (我希望你将所有依赖关系放在父母身上的原因是相关的)

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

更新: 在评论中回答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的一个好处是,如果你把上面的东西放在父POM中作为dependencyManagement,当几个模块需要使用foo:foo-core时,他们只需要声明groupId和artifactId,而不需要重复那些冗长的排除

另一种方法是,例如,在上面的示例中,您仍然需要bar:bar-dep,只是您需要的版本与传递中的版本不同,那么您只需在您的版本中声明所需的正确版本POM和Maven将使用&#34;最近的&#34;版本,如here

所述

还有其他依据empty dependency排除的技巧,如问题评论

中所述