具有范围“导入”和不具有“导入”的“ pom”类型依赖性之间有什么区别?


112

从Maven 2.0.9开始,有可能包含

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

在本<dependencyManagement>节中。

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

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

Answers:


187

您只能导入托管依赖项。这意味着您只能其他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>
...

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

但是,如果仅在POM中定义一个常规依赖项,other-pom-artifact-iddependenciesdependency部分中的所有依赖项都other-pom-artifact-id将包含在您的项目中-但是,该dependencyManagement部分中定义的依赖项other-pom-artifact-id根本不包括在内。

因此,基本上,两种不同的机制用于导入/包括两种不同类型的依赖关系(托管依赖关系和普通依赖关系)。

Maven网站上有一个很好的页面,它可以比我更好地解释这一点,即Maven中的Dependency Management,它还包含有关导入依赖项的特定信息。


1
如果pomA in是pomB的父级,那么您可以将B放在具有范围的项目A的依赖项管理中import吗?
珍妮丝·库哈尔(Janetz Kuhar)

很好的答案,解释它是如何工作的,但是为什么呢?为什么不希望可传递地包含其他依赖项?你们两个都可以吗?导入other-pom-artifact-id,然后再声明other-pom-artifact-id为依赖项吗?
Junchen Liu

关于DZone的一篇文章陈述了一些不同的东西:... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY和Skinny War
coz

1
@JunchenLiu:所以可以说您仅使用项目A的几个功能,因此您可以选择仅包括该功能所需的那些传递依赖项。您也可以通过在<dependency>中使用<exclude>来解决。例如,结帐如下:jdbi.org
#

15

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

import部分中的pom类型依赖性范围<dependencyManagement>使您可以实现的等效性multiple inheritance

您可能会有所不同poms-每个managing相关的依赖关系都是一堆。它们使用这些可能的项目import,这些poms并指定他们需要,而不需要对版本担心的依赖关系。这实际上是一个bill of materials概念,在@ DB5指定的链接中对此进行了说明。

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


8
你确定吗?我将常规pom(具有其自己的依赖项)作为常规依赖项放在其他项目中(打包战争),并将来自pom项目的所有依赖项都包含在目标项目的WEB-INF / lib中。这就是为什么我要问这个问题:)
–grafhez

2
感谢@Raghuram,在回答问题时完全忘记提及父POM选项。至于将pom类型的项目作为简单的依赖项,这是可能的。如原始问题所述,它可用于对依赖项
DB5 2012年


5

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

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

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


很好,很清楚,但是它回答了与上述问题不同的问题。:-)
Rick-777
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.