1 前言

想必这个问题,诸多同仁都遇到过。

很不凑巧,这段时间咱也屡次撞上这问题好几次了。

因此,实在是有必要说说怎么解决好这问题了0.0

2 诊断:包冲突的异常信息特征

  • [类定义未发现错误] NoClassDefFoundError
Caused by: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
  • [方法未发现错误] NoSuchMethodError
Exception in thread "Thread-9" java.lang.NoSuchMethodError: org.eclipse.jetty.server.Server.<init>(Lorg/eclipse/jetty/util/thread/ThreadPool;)V
at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:36)
at java.lang.Thread.run(Thread.java:745)
  • [变量未发现错误] NoSuchFieldError
Exception in thread "main" java.lang.NoSuchFieldError

3 包冲突的主要原因

  • 情况1:同一JAVA工程,依赖了同一JAR包的两个版本。

这可能导致:出现同名类(但其内的method、property可能不同)、缺少当前工程中所依赖的Java类。

  • 情况2:同一JAVA工程,依赖了不同JAR包。

这可能导致:不同JAR包的相同路径中,出现了不同property/method的同名类。何为同名的类?即 类的全限定名相同。

  • 情况3:同一Java工程中,源码(非引入的外部JAR包)中存在完全相同包路径的同名类

    (包路径+类名均完全相同,但该类少了目标方法或目标方法的实现逻辑不同)

    Eg: org.apache.commons-lang3 与 com.google.protobuf
[Example]
2个及以上不同JAR包中均使用了同名的类路径路径org.eclipse.jetty.server.Server.java
而程序真正调用了包冲突导致的错误Server类时,缺少了该方法

4 解决思路与解决过程

4-1 通用方案: 源码工程的pom.xml中排除掉冲突JAR包

针对情况1/2这类一般情况,不适用于情况3这类极端情况

  • step0 Web界面点击某项功能时出现故障。 [start]

  • step1 查看 [服务器日志]

vi /var/ftp/www/myTomcatWebApp/logs/catalina.out

截取有用信息:

  • 方法未发现错误[ NoSuchMethodError ] → 大概率是: 包冲突
  • 关键类: org.eclipse.jetty.server.Server
Exception in thread "Thread-9" java.lang.NoSuchMethodError: org.eclipse.jetty.server.Server.<init>(Lorg/eclipse/jetty/util/thread/ThreadPool;)V
at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:36)
at java.lang.Thread.run(Thread.java:745)
  • step2 搜索该关键类: org.eclipse.jetty.server.Server

IDEA中打开 Java Web应用的项目源码

Shift + Shift : (搜索) org.eclipse.jetty.server.Server

出现多条结果信息,截取有效的信息:

  • org/eclipse/jetty/jetty-server/9.2.22.v20170606/jetty-server-9.2.22.v20170606.jar!/org/eclipse/jetty/server/Server
  • org/eclipse/jetty/jetty-server/9.2.22.v20170606/jetty-all-7.6.0.v20120127.jar!/org/eclipse/jetty/server/Server
  • step3 确认缺陷 / 确认包冲突

[方法1] 通过step2的信息,可确认包冲突 【推荐】

即 在【jetty-server】和【jetty-all】两个jar包中Server类共用了org.eclipse.jetty.server的JAVA包路径

[方法2] 查看[服务器的Java Web应用的lib库] ,可最终确认 包冲突

[root@zunyi91 ~]# ll  /var/ftp/www/myTomcatWebApp/webapps/myWebApp/WEB-INF/lib | grep jetty
-rw-r--r-- 1 root root 540685 4月 3 2019 jetty-6.1.26.cloudera.4.jar
-rw-r--r-- 1 root root 1681148 11月 7 2018 【jetty-all-7.6.0.v20120127.jar】
-rw-r--r-- 1 root root 127310 11月 7 2018 jetty-http-9.2.22.v20170606.jar
-rw-r--r-- 1 root root 108325 11月 7 2018 jetty-io-9.2.22.v20170606.jar
-rw-r--r-- 1 root root 85290 11月 27 2018 jetty-plus-8.1.15.v20140411.jar
-rw-r--r-- 1 root root 89933 11月 27 2018 jetty-security-8.1.15.v20140411.jar
-rw-r--r-- 1 root root 420890 11月 7 2018 【jetty-server-9.2.22.v20170606.jar】
-rw-r--r-- 1 root root 101785 11月 27 2018 jetty-servlet-8.1.15.v20140411.jar
-rw-r--r-- 1 root root 19141 4月 3 2019 jetty-sslengine-6.1.26.cloudera.4.jar
-rw-r--r-- 1 root root 177702 4月 3 2019 jetty-util-6.1.26.cloudera.4.jar
-rw-r--r-- 1 root root 382423 11月 7 2018 jetty-util-9.2.22.v20170606.jar
-rw-r--r-- 1 root root 110102 11月 27 2018 jetty-webapp-8.1.15.v20140411.jar
-rw-r--r-- 1 root root 39077 11月 27 2018 jetty-xml-8.1.15.v20140411.jar
  • step4 更新项目源码: POM.xml中排除(exclude)冲突包
​+ [安装插件] IDEA在安装解决包冲突的插件(Maven Helper) [Setting>Plugins>(Search)"Maven Helper">Install>重启IDEA]

手动下载IDEA插件的URL:

+ [启动插件] IDEA中打开Java Web项目源码的pom.xml,点击插件的启动按钮"Dependency Analyzer"
+ [分析、查看Maven依赖树] 选择"All Dependencies as Tree",在Conflict中搜索"jetty-server"、"jetty-all",即可出现对应JAR包间的依赖树
+ [exclude] 选择任意JAR包,右键,选择“exclude”,即可 对 目标JAT包进行屏蔽

like this.
  • step5 重新打包,重新部署
  • step6 验证测试
[验证方法1] 功能测试,看该功能/界面的缺陷是否消失。
[验证方法2] 白盒测试,从代码层诊断是否解决其缺陷。

4-2 反编译包冲突的工程+修改/新增冲突类的目标方法+再编译/打包

4-3 源码工程中新增完全相同包路径的同名类 (以此替换冲突包的类)

适用于情况3这类极端情况

X 推荐文献

最新文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
  2. 【bzoj4720】[NOIP2016]换教室
  3. python基础——访问限制
  4. iOS中图片动画的三种模式及基本的代码实现
  5. Android Studio 查看密钥库证书指纹SHA1
  6. IE的浏览器模式和文档模式
  7. SteamVR Unity工具包(VRTK)之激光和移动
  8. 什么是LBS?地理位置服务
  9. A - Wireless Network-poj2236(简单并查集)
  10. BootStrap学习之先导篇——响应式网页
  11. mac osx 10.9安装配置macvim
  12. Hbase查看
  13. Linux 添加Nginx 到 service 启动
  14. windows下忘记mysql的root密码解决方法(图文)
  15. UML类图10分钟快速入门
  16. springMVC对异常处理的支持
  17. 利用java反射机制实现读取excel表格中的数据
  18. outlook署名最后一行没换行
  19. 鸟哥Linux私房菜基础学习篇学习笔记1
  20. 12306登录爬虫 cookies版本

热门文章

  1. 关于js数组方法forEach()
  2. k8s配置拉取镜像密钥
  3. 小梅哥课程学习——串口发送应用之发送数据(可在vivado中仿真出现正确波形)
  4. ubuntu14搭建内网gitlab服务器
  5. 6vue分支循环
  6. linux-usermod
  7. [Cisco] IOS NAT Load-Balancing for Two ISP Connections
  8. tensorflow出现Failed to get convolution algorithm, cuDNN failed to initialize
  9. apt常用命令 - 搬运
  10. SQL字符匹配