135

从 Maven 2.0.9 开始有可能包括

<type>pom</type>
<scope>import</scope>

<dependencyManagement>节中。

据我了解,它将被此 pom 中包含的依赖项“替换”,就好像它们最初是在此处定义的一样。

上面的解决方案和对这个没有范围的 pom 的简单依赖有什么区别import(我看到后者被称为“依赖分组”)?这种“分组”依赖关系在解决依赖关系优先级时具有较低优先级的唯一区别是什么?

4

3 回答 3

209

您只能导入托管依赖项。这意味着您只能其他 POM 导入dependencyManagement项目的 POM 部分。IE

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

dependencyManagement然后发生的情况是,在该部分中定义的所有依赖项other-pom-artifact-id都包含在您的 POMdependencyManagement部分中。然后,您可以在您的 POM 部分(及其所有子 POM)中引用这些依赖项,dependency而无需包含version等。

但是,如果在您的 POM 中您只是定义了一个正常的依赖项,other-pom-artifact-id那么所有dependencies来自 的dependency部分other-pom-artifact-id都将传递地包含在您的项目中 - 但是根本不包括在dependencyManagement部分中定义的依赖项。other-pom-artifact-id

所以基本上两种不同的机制用于导入/包含两种不同类型的依赖项(托管依赖项和正常依赖项)。

maven 网站上有一个很好的页面,它可以比我更好地解释这一点,Maven 中的依赖管理,它还包含有关导入依赖项的具体信息。

于 2012-08-02T14:14:28.547 回答
19

您不能将pom类型项目作为simple dependency另一个项目中的 a。(嗯,你可以 - 但它不会做任何有用的事情)。只能有parent-child关系。这本质上是managing dependency through inheritance.

importpom部分中类型依赖的范围<dependencyManagement>允许您实现multiple inheritance.

你可以有不同的poms——每managing一个都有一堆相关的依赖项。使用这些的项目可以使用这些importpoms然后指定他们需要的依赖项,而无需担心版本。这本质上是bill of materials概念,在@DB5 指定的链接中进行了说明。

这有助于防止parent poms复杂的多模块项目变得太大和笨重。

于 2012-08-02T17:26:30.107 回答
9

两个与面向对象编程范式非常相似的概念将有助于回答这个问题:

  1. dependencyManagement部分仅在当前项目中声明依赖项及其详细信息 - 目的是管理详细信息并在其他项目中重用,无论是通过继承(parent)还是导入(scope)。这就像在程序中声明数据类型并使其可供使用。

  2. 依赖部分定义了项目中依赖的实际使用,可选地继承在dependencyManagment下声明的依赖的细节(即版本等)。这就是为什么如果您只将它们放在dependencyManagment中,您将缺少依赖项。这类似于在需要的程序中实例化数据类型的变量实例。

于 2016-07-20T00:28:32.973 回答