maven依赖管理

项目的依赖还有一个特性就是依赖管理(Dependency Management)

如果我们有一个项目,包含多个子模块,而这些子模块可能都需要用到共同的依赖,

如果将这些依赖都放置在项目的pom.xml 中,在遇到依赖升级的时候,我们调整一下项目的pom.xml 里的依赖版本号,就可以让子模块自动升级依赖。

依赖管理很简单,就是在dependencis 元素上包一层dependencyManagement,然后各个子模块只需要声明依赖的groupId 和artifactId,不需要指明版本号,Maven 会自动从项目pom.xml 的dependencyManagment 获取。

 

这里有一个说明,不少程序员将项目用到的所有依赖都声明在pom.xml 中,然后使用依赖管理,各个子模块进行引用。这种做法其实并不太好:首先项目的pom.xml 很长,都是依赖,阅读和查找都很麻烦。

第二是场景,如在项目pom.xml添加servlet-api依赖,远不如在web module中添加更直接。最后还是声明一下,多个模块通用的依赖,放在项目pom.xml中是合适的,

当然如果这样,直接使用dependencies继承也是可以的,具体的操作还是希望各个项目衡量一下,不能一刀切。

 

这里介绍一个在父项目中的根结点中声明dependencyManagement和dependencies的区别

dependencyManagement

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

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

 

例如在父项目里:

<dependencyManagement>  
<dependencies>  
<dependency>  
<groupId>mysql</groupId>  
<artifactId>mysql-connector-java</artifactId>  
<version>5.1.2</version>  
</dependency>  
...  
<dependencies>  
</dependencyManagement>  

 

然后在子项目里就可以添加mysql-connector时可以不指定版本号,例如:

<dependencies>  
<dependency>  
<groupId>mysql</groupId>  
<artifactId>mysql-connector-java</artifactId>  
</dependency>  
</dependencies>  

 

这样做的好处就是:如果有多个子项目都引用同一个依赖,则可以避免在每个子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。

 

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖

 

dependencies相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,

并默认被所有的子项目继承。

你可能感兴趣的:(maven依赖管理)