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

相关文章
相关标签/搜索