前言
项目变大都一般都是用 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 导入就行.
来源: http://www.jianshu.com/p/e29633d12c19