2012-08-02 80 views
71

从Maven的2.0.9起有可能包括scope“import”和“pom”类型依赖关系有什么区别?

<type>pom</type> 
<scope>import</scope> 
<dependencyManagement>部分

据我所知,它将被包含在这个pom中的依赖关系“替换”,就像它们最初在这里定义的一样。

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

回答

130

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

那么,什么情况是,在other-pom-artifact-iddependencyManagement节中定义的所有依赖性都包含在你的POM的dependencyManagement部分。然后,您可以参考在你的POM的dependency部分这些依赖关系(及其所有子多金属氧酸盐),而不必包括version

但是,如果在你的POM你简单地定义一个正常的依赖性other-pom-artifact-id那么所有dependencies从该other-pom-artifact-iddependency部分都包含在及物动词你的项目 - 但是在other-pom-artifact-iddependencyManagement部分定义的依赖不会被包括在内的。

所以基本上两种不同的机制被用于导入/包括两种不同类型的依赖关系(管理依赖性和正常的依赖关系)。

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

+0

如果'pom'一个在为'pom' B的父母,你能不能把项目A的依赖管理B带范围'import'? – 2016-10-26 15:11:46

+0

很好的解释它是如何工作的,但是为什么?为什么你不想过渡地包含其他依赖项?你也可以做两个吗?导入other-pom-artifact-id,然后声明other-pom-artifact-id为依赖关系? – 2016-11-11 10:15:08

+0

一篇文章上DZone规定不同的东西:'... <依赖性> $ {} project.groupId pomlib-lib的 POM 进口 $ { project.groupId} pomlib-war w AR '[DRY和Skinny战争(https://dzone.com/articles/dry-and-skinny-war) – coz 2017-03-29 15:34:15

11

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

import范围为pom类型依赖<dependencyManagement>部分可让您实现相当于multiple inheritance

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

这有助于保持的复杂的多模块项目parent poms过于庞大而笨重。

+5

你确定吗?我把普通的pom(有自己的依赖关系)作为其他项目(包装战争)中的常规依赖项,并从目标项目的WEB-INF/lib中包含的pom项目获得所有依赖项。这就是为什么我问这个问题:) – grafthez 2012-08-02 19:04:55

+1

谢谢@Raghuram,回答这个问题时完全忘记提及父母的POM选项。至于有一个POM类型的项目作为一个简单的依赖这是可能的。正如原始问题中提到的那样,它可以用于[组依赖关系](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html) – DB5 2012-08-03 06:39:06

+1

[关于组依赖的工作链接](https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html#pom-relationships-sect-grouping-deps) – 2016-05-24 12:29:02

4

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

  1. dependencyManagement节仅声明在当前项目的依赖关系和他们的详细资料 - 目的是的细节管理和在其他项目中再利用,或者通过继承()或进口(范围)。这就像在程序中声明数据类型并使其可用。

  2. 依赖性节定义在项目中实际使用的依赖关系,任选继承的细节(即,版本等)下的dependencyManagment声明的依赖性。这就是为什么如果你只把它们放在dependencyManagment中,你将会失去依赖关系。这类似于在需要的程序中实例化数据类型的变量实例。

相关问题