“pom”类型依赖与范围“import”和没有“import”之间有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“pom”类型依赖与范围“import”和没有“import”之间有什么区别?相关的知识,希望对你有一定的参考价值。
从Maven 2.0.9开始,有可能包含
<type>pom</type>
<scope>import</scope>
在<dependencyManagement>
部分。
据我了解,它将被“替换”此pom中包含的依赖项,就像它们最初在此处定义一样。
上面的解决方案与没有import
范围的这个pom的简单依赖之间有什么区别(我看到后者被称为“依赖关系分组”)?这种“分组”依赖关系在解决依赖关系优先级时具有较低优先级的唯一区别是什么?
您只能导入托管依赖项。这意味着您只能将其他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
的other-pom-artifact-id
部分中定义的所有依赖关系都包含在您的POM的dependencyManagement
部分中。然后,您可以在POM(及其所有子POM)的dependency
部分中引用这些依赖项,而不必包含version
等。
但是,如果在你的POM中你只是定义了与other-pom-artifact-id
的正常依赖关系,那么dependencies
的dependency
部分中的所有other-pom-artifact-id
都会被传递到你的项目中 - 但是dependencyManagement
的other-pom-artifact-id
部分中定义的依赖关系根本不包括在内。
所以基本上这两种不同的机制用于导入/包括两种不同类型的依赖(托管依赖和普通依赖)。
maven网站上有一个很好的页面,它可以解释这个比我更好,Dependency Management in Maven,它还包含有关importing dependencies的具体信息。
你不能在另一个项目中将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”类型依赖与范围“import”和没有“import”之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章