在Java平台大型项目的构建中,常常需要在多个子项目间统一依赖库的设置信息,包括依赖那些库?库的版本是什么?等等。为解决这个问题, Maven 中提供了 DependencyManagement 选项。
概念和形式
为了说明 DependencyManagement 的用法,我使用开源项目 ServiceComb 的BMI示例程序作为案例。
在 bmi 的样例的父项目 pom.xml 文件如下:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
可以看到,在26行和43行之间定义了 DependencyManagement,该定义指名了当前项目将继承来至 artifactId 为 java-chassis-dependencies 和 spring-boot-dependencies 的项目的依赖。
我们再打开 java-chassis-dependencies 依赖,可以看到该项目主要包含一个 pom.xml 文件,里面定义了众多的依赖性及其版本。如下(节选):
1 | <properties> |
通过这个方式, BMI项目和其子项目只需要生命依赖库,系统就会使用在 dependencyManagement 中确定的版本。使得在多个项目中维护相同的依赖库及版本变得容易。
如果在子项目中需要定义某个特定的版本,直接在子项目中重复定义即可。
与直接在子项目中使用 dependencies 的区别
dependencies 即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项
ependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;