“pom”类型依赖与范围“import”和没有“import”之间有什么区别?

时间:2012-08-02 13:19:25

标签: java maven dependencies pom.xml

从Maven 2.0.9开始,可以包含

<type>pom</type>
<scope>import</scope>
<{1>}部分中的

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

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

3 个答案:

答案 0 :(得分:163)

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

...
<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的{​​{1}}部分中定义的所有依赖项都包含在您的POM的other-pom-artifact-id部分中。然后,您可以在POM的dependencyManagement部分(及其所有子POM)中引用这些依赖项,而不必包含dependency等。

但是,如果您在POM中只是定义了version的正常依赖关系,那么other-pom-artifact-id的{​​{1}}部分中的所有dependencies都会被传递到您的项目中 - 但是<{1}}的{​​{1}}部分中定义的依赖关系根本不包括在内。

基本上,这两种不同的机制用于导入/包含两种不同类型的依赖项(托管依赖项和普通依赖项)。

maven网站上有一个很好的页面,可以比我更好地解释Dependency Management in Maven,它还包含importing dependencies的具体信息。

答案 1 :(得分:13)

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

import部分中pom类型依赖关系的

<dependencyManagement>范围允许您达到multiple inheritance的等效值。

你可以有不同的poms - 每个managing一堆相关的依赖项。使用这些项目的项目可import这些poms然后指定所需的依赖项而无需担心版本。这基本上是bill of materials概念,在@ DB5指定的链接中说明。

这有助于使复杂的多模块项目parent poms变得过于庞大和笨拙。

答案 2 :(得分:5)

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

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

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