- 什么是BOM
- 一个BOM的格式
- 怎么使用BOM
- 通过parent引用
- 通过dependencyManagement引用
- 怎么查看依赖的某个BOM的具体清单
- 版本冲突时的一些规则
- 何为依赖调节
- 参考资料
什么是BOM
BOM全称是Bill Of Materials,译作材料清单。BOM本身并不是一种特殊的文件格式,而是一个普通的POM文件,只是在这个POM中,我们罗列的是一个工程的所有依赖和其对应的版本。该文件一般被其它工程使用,当其它工程引用BOM中罗列的jar包时,不用显示指定具体的版本,会自动使用BOM对应的jar版本。
所以BOM的好处是用来管理一个工程的所有依赖版本信息。
一个BOM的格式
4.0.0
com.niceshot
test-BOM
0.0.1-SNAPSHOT
pom
Test-BOM
parent pom
test
a
1.2
test
b
1.0
compile
test
c
1.0
compile
其中定义的关键信息是
打包方式是pom文件pom
下定义的各种依赖的版本
怎么使用BOM
通过parent引用
比如我有一个spring boot工程名叫spring-cloud-learn
。由于其本身是一个spring boot工程,所以我可以直接引用Spring boot的BOM,通过
配置,即可
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
com.niceshot
spring-cloud-learn
0.0.1-SNAPSHOT
spring-cloud-learn
Demo project for Spring Boot
通过dependencyManagement引用
parent只能指定一个BOM。如果我还想引入一个或多个BOM,这个时候,就可以使用
配置。也即
不光可以用来定义BOM本身的依赖清单,也可以用作BOM的引入。因为dependencyManagement本身是做依赖管理的,Jar是一种依赖,BOM当然也是一种依赖
怎么查看依赖的某个BOM的具体清单
由于BOM不是一个jar包,所以你没办法在idea的依赖libary中看看到该文件
在idea中的查看方式是通过ctrl + 鼠标点击BOM的artifactId即可看到对应的材料清单
版本冲突时的一些规则
当出现版本冲突时,具体使用哪一个版本的优先顺序是
- 直接在当前工程中显示指定的版本
- parent中配置的父工程使用的版本
- 在当前工程中通过dependencyManagement引入的BOM清单中的版本,当引入的多个BOM都有对应jar包时,先引入的BOM生效
- 上述三个地方都没配置,则启用依赖调解dependency mediation
何为依赖调节
当有两个依赖路径,依赖到同一个jar的不同版本时,最短路径的版本生效,比如A -> B -> C -> D 1.4 and A -> E -> D 1.0
最终将会使用D的1.0版本
参考资料
https://www.baeldung.com/spring-maven-bom
https://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/
https://stackoverflow.com/questions/38496022/maven-bom-bill-of-materials-dependency