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提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
随机推荐
- formily-面向中后台场景的复杂解决方案
正文 在解决企业级应用的前端问题中,表单是个无法绕过的大山,正好最近有时间,调研一下 Formily-来自阿里巴巴的面向中后台复杂场景的表单解决方案,也是一个表单框架,前身是 UForm.主要解决如何 ...
- WPF新手快速入门系列 3.MVVM
[概要] 这一章主要讲述,讲述MVVM模式和用法. 如有学习过程中想交流学习.疑惑解答可以来此QQ群交流:580749909.(所有涉及到的源码都上传到了群文件里) 希望加群的人提问时尽量想清楚自己的 ...
- WPF Devexpress控件库中ChartControl--实现不等距x轴
一.概要 解决问题--ChartControl不等距x轴显示 二.CS代码 用过ChartControl的开发者们应该都知道,ChartControl中设置x轴间距间隔都是固定的数值. 比如(间隔10 ...
- source insight4工具栏还原
source insight4工具栏不小心动了一下,位置全变了,强迫症犯了. 还原步骤. 1.关闭SI4 2.备份 C:\Users\用户名\Documents\Source Insight 4.0\ ...
- 记录laravelchina中的微信小程序教程的npm install安装报错
npm安装报错时 npm ERR! code EIOnpm ERR! syscall symlinknpm ERR! path ../@babel/parser/bin/babel-parser.js ...
- vue 中使用echarts
前言:在vue2.0中使用百度echarts有三种解决方案. 一.原始方法直接使用 这样每次都要获取图表dom元素 然后通过setOption渲染数据,最后在mounted中初始化.很麻烦. < ...
- Unity3d启动事件 - InitializeOnLoad
监听Unity3d启动事件 - InitializeOnLoad http://blog.csdn.net/huutu/article/details/42318499 Unity 监听第一次进入播放 ...
- slua中,绑定lua文件到Monobehavior的一种方法
slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法: public class LuaBeha ...
- java返回树形结构的正确姿势
业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...
- ctf常见源码泄露
前言 在ctf中发现很多源码泄露的题,总结一下,对于网站的搭建要注意删除备份文件,和一些工具的使用如git,svn等等的规范使用,避免备份文件出现在公网 SVN源码泄露 原理 SVN(subversi ...