什麼是BOM#
BOM全稱是Bill Of Materials,譯作材料清單。BOM本身並不是一種特殊的文件格式,而是一個普通的POM文件,只是在這個POM中,我們羅列的是一個工程的所有依賴和其對應的版本。該文件一般被其它工程使用,當其它工程引用BOM中羅列的jar包時,不用顯示指定具體的版本,會自動使用BOM對應的jar版本。
所以BOM的好處是用來管理一個工程的所有依賴版本信息。
一個BOM的格式#
<modelVersion>4.0.0</modelVersion> <groupId>com.niceshot</groupId> <artifactId>test-BOM</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>Test-BOM</name> <description>parent pom</description> <dependencyManagement> <dependencies> <dependency> <groupId>test</groupId> <artifactId>a</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>test</groupId> <artifactId>b</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>test</groupId> <artifactId>c</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
其中定義的關鍵信息是
<packaging>pom</packaging>
打包方式是pom文件<dependencyManagement><dependencies>
下定義的各種依賴的版本
怎麼使用BOM#
通過parent引用#
比如我有一個spring boot工程名叫spring-cloud-learn
。由於其本身是一個spring boot工程,所以我可以直接引用Spring boot的BOM,通過<parent>
配置,即可
<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.niceshot</groupId> <artifactId>spring-cloud-learn</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-learn</name> <description>Demo project for Spring Boot</description>
通過dependencyManagement引用#
parent只能指定一個BOM。如果我還想引入一個或多個BOM,這個時候,就可以使用<dependencyManagement>
配置。也即<dependencyManagement>
不光可以用來定義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