**首先介绍parent**
如果父项目中有这些依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>AAA</groupId>
<artifactId>AAAA</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>BBB</groupId>
<artifactId>BBB</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>CCC</groupId>
<artifactId>CCC</artifactId>
<version>8.2.0</version>
</dependency>
</dependencies>
**parent:**复用父类元素也就是 <dependencies>这个标签里面的依赖!
**dependencyManagement:**子模块中可以选择性继承父类的依赖,此标签中的依赖子pom不会自动继承,子pom需要额外声明。但是,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,确保版本一致。
**Import:**只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中。
如果子项目中引用
<parent>
<groupId>父项目</groupId>
<artifactId>e-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../e-parent</relativePath>
</parent>
则子项目中会引入**BBB**和CCC依赖
如果子项目中
<dependencyManagement>
<dependencies>
<!-- <scope>import</scope>解决单继承问题,类似parent标签, -->
<dependency>
<groupId>父项目</groupId>
<artifactId>父项目</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
则子项目中会引入**AAA**
好处:
在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。
总结:
这种复用可以针对两种依赖,一种是定义在 <dependencies> 中的 <dependency>,这种是无条件继承的;还有一种是定义在 <dependencyManagement> 中的 <dependencies>,这种的如果要在子类中使用,需要手动声明,只需要声明 groupId 和 artifactId 就行,版本则不必声明。
使用 parent 一可以实现复用,二还可以统一管理依赖的版本。
import 能实现类似的功能,它能够解决 parent 不能实现的部分问题,比如多继承。但是相比 parent,它只能作用于 <dependencyMannagement> 元素,它所实现的就是能将目标中的配置导入当前 pom 中,但是不包括插件管理 plugin management。