zoukankan      html  css  js  c++  java
  • Maven依赖管理之BOM

    什么是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

  • 相关阅读:
    [转]只有tcp6没有tcp问题
    Makefile 中:= ?= += =的区别
    【转】docker images 介绍
    [转]我眼中的 Docker(二)Image
    【转】一个简单的Dockerfile实例
    【转】Prometheus 介绍
    [转]MySQL索引类型按存储类型和逻辑区分
    【转】mysql索引类型
    用Unity制作游戏,你需要深入了解一下IL2CPP
    c++中CreateEvent函数
  • 原文地址:https://www.cnblogs.com/niceshot/p/13747547.html
Copyright © 2011-2022 走看看