在 maven 多模块项目中,为了保持模块间依赖的统一,常规做法是在 parent model 中,使用 dependencyManagement 预定义所有模块需要用到的 dependency(依赖)
parent:复用父类元素
dependencyManagement:子模块中可以选择性继承父类的依赖,此标签中的依赖子pom不会自动继承,子pom需要额外声明。但是,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,确保版本一致。
Import:只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中。
properties属性:通过元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。
Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;
org.springframework.cloud
spring-cloud-starter-feign
${spring-cloud-starter-feign.version}
org.springframework.boot
spring-boot-starter-aop
${spring.boot.version}
org.aspectj
aspectjrt
${aspectjrt.version}
```
然后,子 model 根据实际需要引入 parent 中预定义的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
好处:
- 依赖统一管理(parent 中定义,需要变动 dependency 版本,只要修改一处即可);
- 代码简洁(子 model 只需要指定 groupId、artifactId 即可)
- dependencyManagement 只会影响现有依赖的配置,但不会引入依赖,即子 model 不会继承 parent 中 dependencyManagement 所有预定义的 depandency,只引入需要的依赖即可,简单说就是“按需引入依赖”或者“按需继承”;因此,在 parent 中严禁直接使用 depandencys 预定义依赖,坏处是子 model 会自动继承 depandencys 中所有预定义依赖;
但是,问题也出现了:
单继承:maven 的继承跟 java 一样,单继承,也就是说子 model 中只能出现一个 parent 标签;
parent 模块中,dependencyManagement 中预定义太多的依赖,造成 pom 文件过长,而且很乱;
如何让这些依赖可以分类并清晰的管理?
问题解决:import scope 依赖
如何使用:
- maven2.9 以上版本
- 将 dependency 分类,每一类建立单独的 pom 文件
- 在需要使用到这些依赖的子 model 中,使用 dependencyManagement 管理依赖,并 import scope 依赖
- 注意:scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency
示例:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <!-- 重要:版本号要和父模块中预定义的spring boot版本号保持一致 --> <version>${spring.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
maven 编译后,下载了 pom 文件,在 maven 的本地仓库下查看 pom 文件如下:
好处分析:
- 单一职责原则,根据依赖的分类,细化每一个单一职责的 pom 文件
- 解决单继承问题,通过 import pom 文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖
- 父模块的 pom 就会非常干净,容易维护
参考文章:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于