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

gra*_*hez 102 java dependencies pom.xml maven

从Maven 2.0.9开始,有可能包含

<type>pom</type>
<scope>import</scope>
Run Code Online (Sandbox Code Playgroud)

在该<dependencyManagement>部分.

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

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

DB5*_*DB5 175

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

...
<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>
...
Run Code Online (Sandbox Code Playgroud)

然后发生的是,在POM的部分中包含了dependencyManagement部分中定义的所有依赖项.然后,您可以在POM(及其所有子POM)的部分中引用这些依赖项,而不必包含等.other-pom-artifact-iddependencyManagementdependencyversion

但是,如果在你的POM你简单地定义为正常的依赖other-pom-artifact-id,那么所有dependenciesdependency的部分other-pom-artifact-id然而,在定义的依赖关系-在你的项目中包含及物动词dependencyManagement的部分other-pom-artifact-id不包括在所有.

所以基本上这两种不同的机制用于导入/包括两种不同类型的依赖(托管依赖和普通依赖).

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


Rag*_*ram 13

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

importsection中pom类型依赖的范围<dependencyManagement>允许你实现相当于multiple inheritance.

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

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

  • 你确定吗?我把常规pom(有自己的依赖项)作为常规依赖项放在其他项目(打包战争)中,并从目标项目的WEB-INF/lib中包含pom项目的所有依赖项.这就是为什么我问这个问题:) (6认同)
  • [有关组依赖关系的工作链接](https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html#pom-relationships-sect-grouping-deps) (4认同)
  • 谢谢@Raghuram,在回答问题时完全忘记提及父 POM 选项。至于将 pom 类型项目作为简单的依赖项,这是可能的。正如原始问题中提到的,它可以用于[分组依赖项](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html) (2认同)

小智 5

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

  1. dependencyManagement部分只声明依赖及其详细信息在当前项目-目的是细节管理和再利用等项目,无论是通过继承()或进口(范围).这就像在程序中声明数据类型并使其可供使用.

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

  • 这很好也很清楚,但它回答了与上面不同的问题。:-) (9认同)