前言
项目变大都一般都是用maven划分成多模块,若多个模块都有同一个依赖,需要使用<dependencyManagement>
来规定版本
- 父模块如何管理子模块依赖
- 子模块如何使用自定义的依赖版本
- dependencyManagement是否可以继承是否可以覆盖
- 如何使用其它pom的依赖管理
如何使用
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<!--规定版本-->
<version>1.2-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencyManagement>内的依赖并不会真实导入依赖,只是规定了如果 <dependencies>与<dependencyManagement>存在groupId和artifactId相同的dependency,<dependencies>内的dependency可以不用写版本号,而是用<dependencyManagement>内规定的版本号,所以<dependencyManagement>内必须写版本号,不然会报错
用例说明
在本地maven仓库install了这样一个依赖,分别有1.0,1.1,1.2版本
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在test-print内有一个打印版本的类
新建一个名位multi的项目有两个模块,每个模块都依赖test-print,并调用它的show方法打印所依赖的版本
<groupId>com.zolvces</groupId>
<artifactId>multi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>multi-one</module>
<module>multi-two</module>
</modules>
父模块如何管理子模块依赖
在父pom文件内添加依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块的依赖
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
</dependency>
</dependencies>
子模块打印的版本号都为 1.0-SNAPSHOT
由此可见父模块通过dependencyManagement规定了子模块的版本号
子模块如何使用自定义的依赖版本
有一种需求就是父模块规定好了某个依赖的版本,但是子模块因为各种原因需要不同的版本号该怎么办,很简单,如果子模块需要自定义依赖的版本只需要在引入依赖的时候指明版本号就可以
父pom的依赖管理如下
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块引入test-print并指明版本号
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
子模块打印的版本号为1.1-SNAPSHOT
所以子模块想要使用别的版本只需要在引入的时候指定版本号就行
dependencyManagement是否可以继承是否可以覆盖
那么当子模块的pom文件里也规定dependencyManagement又是什么情况
父pom的依赖管理如下
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块pom如下
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块运行打印的版本号是1.2-SNAPSHOT
可见子模块的dependencyManagement覆盖了父pom里的dependencyManagement(相同的依赖才会覆盖,并不是使父pom里面的所有依赖管理都失效)
那么如果这种情况下子模块依赖里添加版本号会怎么样呢,子模块添加依赖的版本号,如下
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zolvces</groupId>
<artifactId>test-print</artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
打印的版本号是1.1-SNAPSHOT
所以版本选择的顺序是
-
依赖里直接指定版本号
-
当前pom的<dependencyManagement>里指定的版本号
-
父pom的<dependencyManagement>里指定的版本号
如何使用其它pom的依赖管理
当子模块想要构建springBoot的时候,已近继承了父pom不能继承spring-boot-starter-parent,只需要导入springBoot
的依赖管理就行,如下
<parent>
<artifactId>more-part</artifactId>
<groupId>com.zolvces</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>core</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注意
<scope>import</scope>只能在 <dependencyManagement> 内使用
同理pom1里想要使用pom2的依赖管理只需要把pom2 impor导入就行。
网友评论