说说发现 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 包存在冲突的方法的主要内容,如果未能解决你的问题,请参考以下文章

Jar包冲突解决方法

JAR冲突问题的解决以及运行状态下如何查看加载的类

jar包冲突的解决方法

曹工杂谈:用好verbose,Jar包冲突不再难

Maven工程jar包冲突解决方法

Maven学习总结(59)—— Maven Jar 包冲突最全解决方案总结