您现在的位置是:亿华云 > 人工智能
Maven中jar包冲突原理及解决的方式
亿华云2025-10-08 21:01:40【人工智能】3人已围观
简介在实际开发中,多模块项目常会使用Maven进行包管理。在poml文件中进行包依赖时,常存在引入一个jar包中默认依赖了其他的jar包的情况。这样很容易导致jar包冲突,从而产生一些诡异问题,如版本问题
在实际开发中,冲突多模块项目常会使用Maven进行包管理。原理在poml文件中进行包依赖时,及解决常存在引入一个jar包中默认依赖了其他的冲突jar包的情况。这样很容易导致jar包冲突,原理从而产生一些诡异问题,及解决如版本问题导致的冲突类、方法找不到等。原理下面我们将聊聊具体关于依赖冲突产生的及解决原因、排查方式以及解决的冲突方案。
依赖传递的原理概念
举个简单例子,比如一个多模块项目依赖关系如下图。及解决其中bepe-dal引入了common-lib,冲突当bepe-manager模块中引入bepe-dal时,原理common-lib这个依赖也会被引入到bepe-manager模块中,及解决这个就是依赖传递。
依赖冲突的概念
依赖冲突指当模块中引入很多jar包时,如果其中存在着groupId和artifactId 一样,但是version不一样的两个jar包,这就是依赖冲突。那么在应用时会选用哪一个version呢?这就是我们接下来要讨论的冲突解决方式。源码下载
依赖冲突该是怎么解决的?
最短路径原则 声明优先原则 依赖排除1. 最短路径原则
当存在groupId和artifactId一致但是version不一致的jar包冲突时,模块会自动选择距离自己路径短的包。如:bepe-manager到common-lib(1.0)的距离为2,bepe-manager到common-lib(2.0)的距离为1,就会选择距离短的common-lib(2.0),这就是最短路径原则。
2. 声明优先原则
当冲突包路径距离长度一样时,这个时候就会依据其在pom文件中声明的先后顺序。
在manager模块pom.xml中,如果先引用bepe-common,就会用2.0版本的common-lib。
<dependency> <groupId>com.company.bepe</groupId> <artifactId>bepe-common</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>om.company.bepe</groupId> <artifactId>bepe-dal</artifactId> <version>2.2</version> </dependency>3. 依赖排除
通过标签将不需要依赖的包进行排除,通过这种方式我们就灵活进行取舍。但是该如何发现冲突呢?接下来将讨论关于依赖冲突排查的方式。
依赖冲突情况该怎么排查?
我们可以借助一些插件工具帮助找出冲突jar的具体位置。下面分享一下我在项目中排查并解决包冲突的两种方式。
maven-enforcer-plugin 插件 Maven Helper 插件1. maven-enforcer-plugin插件
Maven提供了Maven-Enforcer-Plugin插件 , 用来校验约定遵守情况,亿华云比依赖 jar 包的版本等等。当规则检查不通过的时候则会构建失败。
(1) 在pom.xml中引入该插件
rules内则是定义校验规则,通过配置可实现重复依赖检测。也支持自定义做一些其他检验如版本检验等。关于maven-enforcer-plugin插件rules的其他配置用法,感兴趣的朋友们,可以去查阅其相关的资料。
<rules> <requireMavenVersion> <version>3.0.4</version> </requireMavenVersion> <!--要求JDK版本)--> <requireJavaVersion> <version>6.0</version> </requireJavaVersion> <bannedDependencies> <!--是否检查传递性依赖(间接依赖)--> <searchTransitive>true</searchTransitive> <excludes> <exclude>junit:junit</exclude> </excludes> <message>must use TestNG</message> </bannedDependencies> </rules>(2) 配置好插件后进行项目构建,当存在包冲突时会在console中打印出来。
(3) 依据信息便可将不需要的jar包通过排除掉。
2. Maven Helper
使用IntelliJ IDE的Maven helper插件方便找到和排除冲突的依赖项
(1) command+, 打开工具的设置窗口
(2) 设置搜索中输入plugin
(3) 在Marketplace table页面中搜索Maven Helper,并安装
(4) 重启后即可使用,打开pom文件后,文件下面会多出Dependency Analyzer这一个tab,进入Dependency Analyzer视图之后有三个查看选项,分别是Conflicts(冲突)、All Dependencies as List(列表形式查看所有依赖)、All Dependencies as Tree(树结构查看所有依赖)。通过查看信息后再做出对应的依赖冲突处理。高防服务器
总结
关于依赖冲突解决方式有三种:最短路径原则、声明优先原则、依赖排除。在没有手动进行依赖排除的情况下,会依据最短路径原则、声明优先原则来选择jar包。关于依赖冲突排查可借助如maven-enforcer-plugin 与Maven Helper 插件。根据实际情况及环境,选择组合最优的解决方案解决依赖冲突问题。
很赞哦!(26975)
相关文章
- 如果你的潜在终端必须是这个米(域名),那么潜在终端并不多,也没有硬通货,那么你的域名应该在终端有兴趣购买时出售。否则,你可能得自己留着吃。
- Mysql建库字符集和排序规则及说明
- 炒上天的NFT,元宇宙的隐形秩序之钥:他们为什么火
- DevOps测试必备基础 :实践分享和适用工具推荐
- 因为域名解析需要同步到DNS根服务器,而DNS根服务器会不定时刷,只有DNS根服务器刷新后域名才能正常访问,新增解析一般会在10分钟左右生效,最长不会超过24小时,修改解析时间会稍微延长。
- Nest.Js + Sms 实现短信验证码登录
- 手写一个Redis分布式锁,让你彻底搞懂
- 不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
- MySQL转Oracle遇到的问题:表名长度及大小写问题
站长推荐
域名不仅仅是一个简单的网站。对于有长远眼光的公司来说,在运营网站之前确定一个优秀的域名对有长远眼光的公司来说是非常重要的。这对今后的市场营销、产品营销和企业品牌建设都具有十分重要的意义。优秀的域名是企业在市场竞争中获得持久优势的利器。
IPython 8.0 大版本更新,支持代码自动补全
Golang 语言 Vendor 在 Gopath 和 Modules 中的区别
计算机体系结构的一知半解
这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
MySQL 啥时候用记录锁,啥时候用间隙锁?
2021 流行的十大项目,新项目居榜首,总有长江后浪推前浪!
一日一技:轻松排雷,爬虫让 Gzip 炸弹变哑炮