Maven依賴管理之BOM

什麼是BOM

BOM全稱是Bill Of Materials,譯做材料清單。BOM自己並非一種特殊的文件格式,而是一個普通的POM文件,只是在這個POM中,咱們羅列的是一個工程的全部依賴和其對應的版本。該文件通常被其它工程使用,當其它工程引用BOM中羅列的jar包時,不用顯示指定具體的版本,會自動使用BOM對應的jar版本。java

因此BOM的好處是用來管理一個工程的全部依賴版本信息。spring

一個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>

其中定義的關鍵信息是maven

  • <packaging>pom</packaging>打包方式是pom文件
  • <dependencyManagement><dependencies>下定義的各類依賴的版本

怎麼使用BOM

經過parent引用

好比我有一個spring boot工程名叫spring-cloud-learn。因爲其自己是一個spring boot工程,因此我能夠直接引用Spring boot的BOM,經過<parent>配置,便可ide

<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固然也是一種依賴spring-boot

怎麼查看依賴的某個BOM的具體清單

因爲BOM不是一個jar包,因此你沒辦法在idea的依賴libary中看看到該文件
idea

在idea中的查看方式是經過ctrl + 鼠標點擊BOM的artifactId便可看到對應的材料清單
code

版本衝突時的一些規則

當出現版本衝突時,具體使用哪個版本的優先順序是blog

  • 直接在當前工程中顯示指定的版本
  • parent中配置的父工程使用的版本
  • 在當前工程中經過dependencyManagement引入的BOM清單中的版本,當引入的多個BOM都有對應jar包時,先引入的BOM生效
  • 上述三個地方都沒配置,則啓用依賴調解dependency mediation

何爲依賴調節

當有兩個依賴路徑,依賴到同一個jar的不一樣版本時,最短路徑的版本生效,好比A -> B -> C -> D 1.4 and A -> E -> D 1.0最終將會使用D的1.0版本ip

參考資料

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-dependencyci

相關文章
相關標籤/搜索