Maven BOM!拿来吧你
what BOM?
BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,
使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。
BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。
why BOM?
使用BOM除了可以方便使用者在声明依赖的客户端时不需要指定版本号外,
最主要的原因是可以解决依赖冲突,如考虑以下的依赖场景:
项目A依赖项目B 2.1和项目C 1.2版本:在该例中,项目A对于项目D的依赖就会出现冲突,按照maven dependency mediation的规则,最后生效的可能是:项目A中会依赖到项目D1.1版本(就近原则,取决于路径和依赖的先后,和Maven版本有关系)。
项目B 2.1依赖项目D 1.1版本;
项目C 1.2依赖项目D 1.3版本;
在这种情况下,由于项目C依赖1.3版本的项目D,但是在运行时生效的确是1.1版本,
所以在运行时很容易产生问题,如 NoSuchMethodError, ClassNotFoundException等,
有些jar包冲突定位还是比较难的,这种方式可以节省很多定位此类问题的时间。
Spring、SpringBoot、SpringCloud自身都采用了此机制来解决第三方包的冲突,
常见官方提供的BOM:
1) RESTEasy Maven BOM dependency
org.jboss.resteasy
resteasy-bom
3.0.6.Final
pom
import
2. JBOSS Maven BOM dependency
org.jboss.bom
jboss-javaee-6.0-with-tools
${some.version}
pom
import
3) Spring Maven BOM dependency
org.springframework
spring-framework-bom
4.0.1.RELEASE
pom
import
4) Jersey Maven BOM dependency
org.glassfish.jersey
jersey-bom
${jersey.version}
pom
import
5) SpringCloud SpringBoot Maven BOM dependency
org.springframework.boot
spring-boot-dependencies
2.4.4
pom
import
org.springframework.cloud
spring-cloud-dependencies
2020.0.2
pom
import
看着有点蒙不要紧,下面会详细介绍这些配置的作用
自己开发的项目中也建议使用此优良传统, 尤其实在项目开发初期,在后期再修改成BOM可能涉及很多版本的修改,就比较难了。
how BOM? 定义BOM
BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有
这一个部分。只需要在
定义对外发布的客户端版本即可,比如需要在项目中统一所有SpringBoot和SpringCloud的版本
第一步需要在POM文件中增加两个的官方BOM,以目前最新稳定的SpringBoot版本为例,使用官方推荐的版本组合比较稳定,一般不会有什么大的问题
文章图片
com.niu.not
niu-dependency
1.1.1
4.0.0 pom
org.springframework.boot
spring-boot-dependencies
2.4.6
pom
import
org.springframework.cloud
spring-cloud-dependencies
2020.0.3
pom
import
com.google.code.gson
gson
2.8.6
下面的Gson是除了SpringBoot和SpingCloud外需要统一版本的jar
其他工程使用方法
在项目主pom.xml文件中
节点下加入BOM的GAV信息如下:
com.niu.not
niu-dependency
1.1.1
pom
import
在需要使用相关JAR包的pom.xml文件中
节点下引入如下:
org.springframework.cloud
spring-cloud-starter-openfeign
com.google.code.gson
gson
这种设置后,如果项目要求升级Spring版本,只需要在提供方升级验证兼容性,然后修改BOM依赖即可
如果需要使用不同于当前bom中所维护的jar包版本,则加上
覆盖即可,如:
org.springframework.cloud
spring-cloud-starter-openfeign
com.google.code.gson
gson2.8.2
小结 Jar包冲突非常烦人,Spring框架相关的冲突,有些报错非常不清晰或者根本不报错直接停止服务,
这种问题很难定位,开发人员应该聚焦业务开发,不应该在这上面浪费过多时间,
所以统一的版本管理还是非常有用的,不然Spring的牛逼框架为啥都在用呢,
【Maven BOM!拿来吧你】BOM管理,拿来吧你!!!
参考: https://howtodoinjava.com/mav...
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 拿着旧地图,找不到新大陆
- 生命中最迷人的部分轻拿轻放
- 凡有的,还要多给他,凡没有的,连他现有的也要拿走
- 七夕情浓(高逼格的单身生活,还得拿钱买单)
- 清华教授用了12小时讲完的Python,整整400集,拿走不谢!
- 拿起一本书,如何透视它呢()
- 贵(贱?)
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- maven使用tomcat7插件编译jsp出错