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
Maven依赖管理之BOM的更多相关文章
- maven依赖管理
maven依赖管理 1.依赖范围 (依赖相当于java中的import 是否需要导入别的jar包) 使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系 complie ...
- Java-Maven-Runoob:Maven 依赖管理
ylbtech-Java-Maven-Runoob:Maven 依赖管理 1.返回顶部 1. Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或 ...
- maven 学习---Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
- 【Tool】Windows系统安装Maven依赖管理工具
安装Maven依赖管理工具 官网下载地址:http://maven.apache.org/download.cgi 系统环境要求: [JDK]Maven3.3版本+需要JDK1.7版本以上支持 [内存 ...
- 【第十五篇】- Maven 依赖管理之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 依赖管理 Maven 一个核心的特性就是依赖管理.当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难.针对此种情形,Maven 提供了 ...
- Gradle Maven 依赖管理
仓库管理简介 本质上说,仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库. Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 我们来看一下,对于每一 ...
- Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理
原文链接: Spring Security with Maven原文日期: 2013年04月24日翻译日期: 2014年06月29日翻译人员: 铁锚 1. 概述 本文通过实例为您介绍怎样使用 Mave ...
- maven——依赖管理
管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解决什么问题:什么是依赖范围:使用包依赖的最佳实践等 6 个问 ...
- Maven学习(十八)-----Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
随机推荐
- 单元测试利器Mockito框架
什么是Mock Mock 的中文译为仿制的,模拟的,虚假的.对于测试框架来说,即构造出一个模拟/虚假的对象,使我们的测试能顺利进行下去. Mock 测试就是在测试过程中,对于某些 不容易构造(如 Ht ...
- 前端ES6 一些面试题
1.ES5.ES6和ES2015有什么区别? ES2015特指在2015年发布的新一代JS语言标准,ES6泛指下一代JS语言标准,包含ES2015.ES2016.ES2017.ES2018等.现阶段在 ...
- 冒泡排序的优化方案BubbleSort
<?php /** * 冒泡排序 * * ------------------------------------------------------------- * 思路分析:就是像冒泡一样 ...
- sqlmap 的 --forms之理解
对于一个页面的form表单中的数据进行注入测试 方法有三个 ①burp抓包 将数据储存为文本文件 然后 sqlmap中使用 -r 参数进行测试 ②使用 --data参数,将数据进行测试 ③直接使用- ...
- 2020最新Servlet+form表单实现文件上传(图片)
servlet实现文件上传接受 这几天学了一点文件上传,有很多不会,在网查了许多博客,但是最新的没有,都比较久了 因为我是小白,版本更新了,以前的方法自己费了好久才弄懂,写个随笔方便以后查找 代码奉上 ...
- 微信小程序|小游戏
[官]小游戏开发 https://developers.weixin.qq.com/minigame/dev/index.html 官网 https://mp.weixin.qq.com 做了4个微信 ...
- photonServer学习之连接数据库
string connectStr = "server=127.0.0.1;port=3306;database=database;user=root;pwd=root";//连接 ...
- Docker 容器编排利器 Docker Compose
Compose 简介 通过前面几篇文章的学习,我们可以通过 Dockerfile 文件让用户很方便的定义一个单独的应用容器.然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如 ...
- Mybatis源码学习第七天(PageHelper分析)
其实我本来是不打算写这个PageHelper的,但是后来想了想,还是写了吧!现在市场用Mybatis的产品分页应该差不多都是用PageHelper来实现的,毕竟Mybatis的分页rowbound.. ...
- ARM函数调用总结
ARM架构寄存器介绍 ARM架构下处理器有7种工作模式: 1. USR模式:正常用户模式,在USR模式下进程正常执行 2. FIQ模式(Fast Interrupt Request):处理快速中断模式 ...