一、dependencymanagement
1、在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
2、pom.xml文件中,jar的版本判断的两种途径:
- 如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。
- 如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
3、dependencies和dependencyManagement的区别
3.1 dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
3.2 dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
二、parent标签
parent用于引用父工程
1、统一管理jar包的版本,其依赖需要在子工程中定义才有效(比如此例)
2、统一的依赖管理(父工程的,子工程不必重新引入,功能和dependencyManagement类似)
3、控制插件的版本
parent标签一般会和dependencyManagement结合使用,即:
- 不是全部需要的依赖写在dependencyManagement中,让子项目免除写版本号
- 共的依赖写在parent的<dependency>中,子项目就不用导入依赖了,因为parent的<dependency>是默认被子项目下载的
三、dependencyManagement与dependencies的区别
dependencyManagement:并不实际引入,要和dependencies结合使用
dependencies:可单独使用,也可结合dependencyManagement使用,当结合dependencyManagement使用的时候,可不写版本号,dependencies在子项目中会自动引入这些依赖
四、dependencyManagement与parent标签的区别
1、dependencyManagement标签
作用就是版本依赖的管理,免写版本号,如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明。
在子项目中不会自动引入这些依赖,子项目如果想使用,还是需要单独引入,但是可以不写版本号(这是dependencyManagement的主要作用),但是如果子项目定义一个新的版本,那么就会覆盖parent的版本。
总结:dependencyManagement作用只有一个,管理依赖的版本号,作用是可以统一依赖
2、parent标签
1、抽象,被子类继承
- 对于公共的包,在父模块中直接引入,子模块的pom就简单了
2、parent中也可以使用dependencyManagement来管理依赖,那么子模块继承了parent模块之后,就实现不用写部分常用包的版本号了
- 但是:我们还可以在子模块定义dependencyManagement标签,因为有些在parent中没有,比如Springboot项目的parent中并没有SpringCloud的版本,所以我们需要定义下
3、控制插件的版本
在SpringCloud项目中,我们一般使用两个管理版本间的依赖:
<!-- 管理springboot相关的依赖包版本 -->
<!-- 有了这个配置,我们的pom中引入springboot相关依赖包时就不用写版本号了 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
<relativePath/>
</parent>
<!-- 管理SpringCloud相关的依赖包版本 -->
<!-- 有了这个配置,我们的pom中引入springcloud相关依赖包时就不用写版本号了 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
参考: