说说发现 Jar 包存在冲突的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说说发现 Jar 包存在冲突的方法相关的知识,希望对你有一定的参考价值。
参考技术A 点击需要排查 Jar 冲突的项目,然后点击右上的 “Show Dependencies”按钮,生成 Jar 依赖图谱:如果依赖的包很多,就会太小,看不清。这时可以右键点击Jar包依赖图谱,选择 Actual Size,会以实际尺寸打开依赖图谱。
还可以在图谱中键入 CTRL + F,打开搜索框,输入我们要查看的 jar 包关键字:
如果存在冲突,图谱就会以红线进行标注。比如这里的 mybatis 存在两个版本(3.5.6 与 3.4.6):
发现一个项目使用 MyBatis 自定义拦截器不生效。
这个项目依赖于 mybatis-spring-boot-starter,利用 Jar 依赖图谱发现存在两个版本(2.1.1 与 2.1.4)
项目的 pom.xml 中明确依赖的 mybatis-spring-boot-starter 版本是 2.1.4。那么另一个版本是来自哪里?
继续查找,发现 pagehelper-spring-boot-starter 内部依赖了 mybatis-spring-boot-starter:
继续深入跟踪发现pagehelper-spring-boot-starter 内部依赖的 mybatis-spring-boot-starter 版本为 2.1.1。
后来在项目中屏蔽掉 pagehelper-spring-boot-starter,我们自定义的 MyBatis 拦截器就可以正常使用了。
Maven学习总结(59)—— Maven Jar 包冲突最全解决方案总结
前言
在实际开发中,多模块项目常会使用 Maven 进行包管理。在 poml 文件中进行包依赖时,常存在引入一个 jar 包中默认依赖了其他的 jar 包的情况。这样很容易导致 jar 包冲突,从而产生一些诡异问题,如版本问题导致的类、方法找不到等。下面我们将聊聊具体关于依赖冲突产生的原因、排查方式以及解决的方案。
- 依赖传递的概念:举个简单例子,比如一个多模块项目依赖关系如下图。其中 bepe-dal 引入了 common-lib,当 bepe-manager 模块中引入 bepe-dal 时,common-lib 这个依赖也会被引入到 bepe-manager 模块中,这个就是依赖传递。
- 依赖冲突的概念:依赖冲突指当模块中引入很多 jar 包时,如果其中存在着 groupId 和 artifactId 一样,但是 version 不一样的两个 jar 包,这就是依赖冲突。那么在应用时会选用哪一个 version 呢?这就是我们接下来要讨论的冲突解决方式。
依赖冲突该是怎么解决的?
- 最短路径原则
- 声明优先原则
- 依赖排除
最短路径原则
当存在 groupId 和 artifactId 一致但是 version 不一致的 jar 包冲突时,模块会自动选择距离自己路径短的包。如:bepe-manager 到 common-lib (1.0) 的距离为 2,bepe-manager 到common-lib (2.0) 的距离为 1,就会选择距离短的 common-lib(2.0),这就是最短路径原则。
以上是关于说说发现 Jar 包存在冲突的方法的主要内容,如果未能解决你的问题,请参考以下文章