Answers:
您只能导入托管依赖项。这意味着您只能将其他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
部分中。然后,您可以在dependency
POM(及其所有子POM)部分中引用这些依赖项,而不必添加version
等。
但是,如果仅在POM中定义一个常规依赖项,other-pom-artifact-id
则dependencies
该dependency
部分中的所有依赖项都other-pom-artifact-id
将包含在您的项目中-但是,该dependencyManagement
部分中定义的依赖项other-pom-artifact-id
根本不包括在内。
因此,基本上,两种不同的机制用于导入/包括两种不同类型的依赖关系(托管依赖关系和普通依赖关系)。
Maven网站上有一个很好的页面,它可以比我更好地解释这一点,即Maven中的Dependency Management,它还包含有关导入依赖项的特定信息。
... <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
您不能将pom
类型项目作为simple dependency
另一个项目中的。(嗯,您可以-但它不会做任何有用的事情)。只能有一种parent-child
关系。这本质上是managing dependency through inheritance
。
import
部分中的pom
类型依赖性范围<dependencyManagement>
使您可以实现的等效性multiple inheritance
。
您可能会有所不同poms
-每个managing
相关的依赖关系都是一堆。它们使用这些可能的项目import
,这些poms
并指定他们需要,而不需要对版本担心的依赖关系。这实际上是一个bill of materials
概念,在@ DB5指定的链接中对此进行了说明。
这有助于防止parent poms
复杂的多模块项目变得太大和笨拙。
与面向对象编程范例非常相似的两个概念将有助于回答以下问题:
该dependencyManagement部分只声明依赖及其详细信息在当前项目-目的是细节和再利用其他项目的管理,无论是通过继承(母)或进口(范围)。这就像在程序中声明数据类型并使之可用。
该相关性部分定义实际使用的依赖关系的项目,可选继承下宣布的依赖关系的细节(即,版本等)dependencyManagment。这就是为什么如果仅将依赖项放入dependencyManagment中,则会缺少依赖项。这类似于在需要它的程序中实例化数据类型的变量实例。
pom
A in是pom
B的父级,那么您可以将B放在具有范围的项目A的依赖项管理中import
吗?