Maven的dependencyManagement

阅读更多
http://blog.sina.com.cn/s/blog_6125fe5d0100zxrz.html
结论:
scope写在子项目中的 下的中,或是写在父项目中的中,都是可以的。
但有一点需要注意,dependencies 和 dependencyManagement 的区别在于:
前者,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。
后者,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的;只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version 和 scope 都读取自 父pom。



今天我在配置 sellercenter 的接口测试环境的时候,发现一些依赖的写法不太一致:

比如有的依赖的是写在子项目中的 下的 标签中,

而有的依赖的是写在父项目中的 中 。

我知道前一种写法是对的,而后一种写法却不知道对不对了,从网上查了下,没有找到非常确切的答案,于是自己验证了一把。

把验证过程给大家说下,大家也可以自己练手。

首先新建三个项目,Parent作为父项目、projectA、projectB作为子项目。

在父项目Parent中依赖项如下:



junit
junit
4.8.1
test



在子项目projectA、projectB中没有写任何依赖,在projectA 下运行命令 mvn help:effective-pom,会发现A下面有 junit 4.8.1的依赖。

如果我把 父项目Parent 中的依赖修改如下:




junit
junit
4.8.1
test




子项目ProjectA、projectB下面还是没有任何依赖项,在projectA 下运行命令 mvn help:effective-pom,会发现A下面 没有 junit 4.8.1的依赖。

如果我在projectA 下添加junit的依赖:



junit
junit



再在projectA 下运行命令 mvn help:effective-pom,会发现A下面有了 junit 4.8.1的依赖,并且scope为 test。

那么经过验证,scope写在子项目中的 下的中,或是写在父项目中的中,都是可以的。

但有一点需要注意,dependencies 和 dependencyManagement 的区别在于:

前者,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。

后者,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的;只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version 和 scope 都读取自 父pom。

另外一篇:

Maven在dependencyManagement元素中为你提供了一种方式来统一依赖版本号。你经常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。使用pom.xml中的dependencyManagement元素能让你在子项目中引用一个依赖而不用显式的列出版本号。

Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。



  4.0.0
  org.sonatype.mavenbook
  a-parent
  1.0.0
 
 
   
     
        mysql
        mysql-connector-java
        5.1.2
     

     
   
 

来源:http://www.blogjava.net/jjshcc/archive/2011/07/08/353914.html


然后,在子项目中,你可以使用如下的依赖XML添加一个对MySQL Java Connector的依赖:

  4.0.0
 
    org.sonatype.mavenbook
    a-parent
    1.0.0
 

  project-a
 
 
   
      mysql
      mysql-connector-java
   

 




如果mysql-connector-java在顶层父项目中被作为一个依赖列出,这个层次中的所有项目都将引用该依赖。使用dependencyManagement能让你统一并集中化依赖版本的管理,而不用添加那些会被所有子项目继承的依赖。

你可能感兴趣的:(maven)