Maven依赖冲突在IDEA中的简单解决方案
0.背景
- 原因
maven依赖冲突,无非就是导入了多个版本的依赖包,程序里不知道用哪个了。
在我们目前的项目中使用了A和B两个包,A包在依赖中依赖了C包,而B包在依赖中也依赖了C包。但是A包依赖的C的1.0版本,B依赖C包的是2.0版本。
此时,我们的项目中就出现了1.0.和2.0两个版本的C包。
此时Maven会依赖路径最短优先原则,来决定使用哪个版本的Jar包,而另外一个无用的Jar包则未被使用,这就是所谓的依赖冲突。
在大多数的时候,依赖冲突并不会对系统造成异常,因为Maven始终会选择一个Jar包来使用,但是在特定的情况下因为Jar包版本不同会造成找不到类的异常。
如果存在依赖冲突最好解决掉,不要给系统留下隐患。
对于依赖某个组件的多个版本,maven的仲裁过程,并不是简单的使用高版本,而是根据从根节点到各个组件节点之间的路径深度,路径短的组件优先。
如果路径深度相同,则是先发现的那个(POM中依赖声明的顺序、子pom内声明的优先于父pom中的依赖),类似一棵树的广度遍历。
maven有自己处理依赖冲突的方案为啥还会有依赖冲突这种问题?
- 解决
解决依赖冲突可以使用maven的exclusion标签
手动排除A包或者B包中的那个冲突的C包
实例
1.自动排除
idea里面安装maven-helper插件。
安装之后,pom文件出会出现这个选项。
白色的是当前解析的版本,红色的就是冲突的版本,然后根据实际情况选择排查哪个,右键会出现exclude(排除)选项,点击后就会自动在pom文件里帮你添加exclude。
右键可以排除它
你看图里这个节点就会自动帮你追加exclude。
2.利用idea的pom图帮助你分析
如果你想深入分析一波的话,不然这里不用看了.
在pom文件中,我们手动引入了mapstruct 1.4.1.Final
这个包。
同时在下方引入了springfox 3.0.0
这个包
这个时候项目是能正常启动的,因为我们在根pom文件中指明了mapstruct
的版本为1.4.1.Final
。
不过,当我们看依赖树的时候,会发现红色的线。
以上图这个最下方的地方为例,除了红色的线,我们还能点击另一条线看到另一引用位置。
查看时长按Alt可以有放大镜效果
这是啥意思呢,就是说springfox-swagger2
这里也用到了mapstruct,查看到它的版本是1.3.1.Final。
这个时候我们就可以根据自己项目的实际情况,保留一个版本即可,比如去掉这个1.3.1的。
点击后,这条线就消失了。
通过springfox-boot-starter- > springfox-swagger2 -> mapstruct这条路径排除掉了冗余的1.3.1版本。
然后你会看到pom文件里多了一行这个。
好啦大致的过程就是这样。
再强调一遍,这里我偷懒了,其实我不排这个包也没问题,因为我项目的根pom中有指明版本,项目是正常启动的。
我的本意是当你遇到依赖冲突问题时,按照上面的思路进行处理。
__EOF__

本文链接:https://www.cnblogs.com/yang37/p/16168279.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具