项目中,经常会遇到ClassNotFound,NoSuchMethod异常,第一反应往往是类路径不对,jar没有正确的引用。第一步判断jar是否加载,还是 加载的jar由于maven依赖管理存在传递依赖,造成依赖的jar版本号不对,相应的类找不到,或者是相应类版本不对,没有对应的方法。

一 造成jar 冲突的原因:如果项目中存在对同一jar不同版本依赖的时候,maven 2根据最近原则,默认引用最靠近项目版本的jar,maven 2.0.9会根据最先声明原则 来引用相应版本的jar;无论那种方式,都会出现jar包冲突。在这里提一下gradle依赖,会依赖最新版本的jar。

二 判断jar是否正确的被引用 有两种方法:

1在项目启动时加上VM参数:-verbose:class

项目启动的时候会把所有加载的jar都打印出来 类似如下的信息:

classpath加载的jar

-classpath /home/yao/tool/jdk1.8.0_25/jre/lib/jce.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/resources.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/management-agent.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/jfxswt.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/plugin.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/javaws.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/charsets.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/jsse.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/deploy.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/jfr.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/ext/localedata.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/ext/nashorn.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/ext/jfxrt.jar:

/home/yao/tool/jdk1.8.0_25/jre/lib/ext/sunjce_provider.jar:

...............等等

具体load的类

[Loaded java.lang.Object from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.io.Serializable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.Comparable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.CharSequence from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.String from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.reflect.AnnotatedElement from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.reflect.GenericDeclaration from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.reflect.Type from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

[Loaded java.lang.Class from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

..................等等

我们可以通过上面的信息查找对应的jar是否正确的被依赖,具体类加载情况,同时可以看到版本号,确定是否由于依赖冲突造成的jar引用不正确;

2 通过maven自带的工具:‍‍mvn dependency:tree

具体后面可以加 -Dverbose 参数 ,详细参数可以去自己搜,这里不详细介绍。

比如分析如下POM

运行: mvn dependency:tree -Dverbose

org.apache.poi

poi

3.2-FINAL

commons-beanutils

commons-beanutils

1.7.0

输出结果:

[INFO] ------------------------------------------------------------------------

[INFO]

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Dependency ---

[INFO] com.yao:Dependency:pom:1.0-SNAPSHOT

[INFO] +- org.apache.poi:poi:jar:3.2-FINAL:compile

[INFO] | +- commons-logging:commons-logging:jar:1.1:compile

[INFO] | | \- log4j:log4j:jar:1.2.13:compile

[INFO] | \- (log4j:log4j:jar:1.2.13:compile - scope updated from runtime; omitted for duplicate)

[INFO] \- commons-beanutils:commons-beanutils:jar:1.7.0:compile

[INFO] \- (commons-logging:commons-logging:jar:1.0.3:compile - omitted for conflict with 1.1)

[INFO] ------------------------------------------------------------------------

通过里面的信息可以看到 两个jar都commons-logging存在依赖,但是版本不同。里面的详细信息显示引用了 commons-logging:commons-logging:jar:1.1 去掉了commons-logging:commons-logging:jar:1.0.3 (omitted for duplicate)。

通过以上方法我们可以看到项目中引用jar版本号;接下来就是如何排除掉我们不想要版本的jar;

三 通过Idea intellij 中的Show Dependencies的工具去除重复的jar

在Pom.xml文件上右击 选择 Diagrams -> Show Dependencies 即可查看Pom的依赖图,通过图可以很容易的看到依赖冲突的jar,exculude掉不想要的版本jar即可。

maven依赖的jar包版本不一样_Maven依赖jar包冲突常见的解决方法相关推荐

  1. Maven 父pom中dependencyManagement版本优先级高于传递依赖版本

    当使用了传递依赖,也就是使用了没有显示声明的依赖时,如果继承的<dependencyManagement/>中声明了使用的传递依赖的版本,那么最终使用的依赖是<dependencyM ...

  2. jar包冲突常用的解决方法

    转载自https://www.cnblogs.com/xiayangy/p/4038347.html jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException ...

  3. Idea导出jar包运行报错:找不到主清单属性解决方法

    Idea导出jar包运行报错:找不到主清单属性解决方法 参考文章: (1)Idea导出jar包运行报错:找不到主清单属性解决方法 (2)https://www.cnblogs.com/stars-on ...

  4. RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法

    RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法 一.示例程序 1.依赖 2.示例代码 3.测试读取文件 ...

  5. JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法

    JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法 问题描述 问题分析 解决方法 项目码云(Gitee)地址:https://gitee.com/banma ...

  6. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

    使用enrichKEGG做通路富集分析时,一直报错:显示No gene can be mapped.... k <- enrichKEGG(gene = gene, organism = &qu ...

  7. linux版本beyond compare 4 的30天试用期已过-解决方法

    windows版本的方法是通过删除注册表,可以参考下面文章 beyond compare 4 的30天试用期已过-解决方法_andylauren的专栏-CSDN博客_beyond compare 试用 ...

  8. 3.6版本后的matplotlib使用plot_surface作图无效果的解决方法

      在使用3.6.2版本的matplotlib使用以下代码进行作图时发现plot_surface无效果,显示的图上只有坐标,没有数据. fig = plt.figure() ax = Axes3D(f ...

  9. curl 安装_记一次因curl版本过低导致zabbix server不停重启问题及解决方法

    概述 今天主要分享一次在配置邮件的时候碰到zabbix server不停重启问题及解决思路. 报错日志 思路: Crash occurs in alerter process when sending ...

最新文章

  1. @2021高考生,用 Python 分析专业“钱景”
  2. 全景图拼接算法实现与改进
  3. NIOS2随笔——DMA(1)
  4. python3 中递归的最大次数
  5. 单例模式---懒汉模式与饿汉模式
  6. C# 系统应用之无标题窗体移动的两种方法
  7. 在Linux中创建静态库.a和动态库.so
  8. 沙利文:2019Q4中国公有云市场份额:阿里云、腾讯云、华为云位列前三
  9. JAVA嵌入运行Groovy脚本
  10. 通信系统仿真中的几个能量归一化问题
  11. 关于直播,所有的技术细节都在这里了(二)
  12. Android 模拟器中sd卡的创建 和文件的上传
  13. BZOJ4487 [JSO12015] 染色问题 容斥原理
  14. pr图形模板预设怎么使用_PR怎样安装动态图形模板?怎样调用Mogrt预设?Premiere导入MOGRTs预设完整教程...
  15. oracle日常积累小知识
  16. kube-controller-manager源码分析(三)之 Informer机制
  17. 牛客网--关于合法括号序列判断
  18. 自然语言处理(NLP)入门(1)——前言
  19. Linux运维经典问题33则(附赠年薪10W+面试题与答案)
  20. 员工和老板的差距不只是能力,还有战略思维

热门文章

  1. EncryptionHelper.cs(20170223)
  2. [网络流24题]圆桌问题
  3. 关于事件委托的整理 ,另附bind,live,delegate,on区别
  4. ASP.NET MVC中如何在客户端进行必要的判断
  5. 用python扩展snmp
  6. ASP.NET数据绑定的记忆碎片
  7. java循环标号_java 标号 break 自循环
  8. 一本关于HTTP的恋爱日记
  9. 【JEECG技术文档】JEECG在线聊天插件功能集成文档
  10. 编程体系结构(02):Java异常体系