[JAVA/Maven/IDEA]解决JAR包冲突
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包进行屏蔽
- step5 重新打包,重新部署
- step6 验证测试
[验证方法1] 功能测试,看该功能/界面的缺陷是否消失。
[验证方法2] 白盒测试,从代码层诊断是否解决其缺陷。
4-2 反编译包冲突的工程+修改/新增冲突类的目标方法+再编译/打包
4-3 源码工程中新增完全相同包路径的同名类 (以此替换冲突包的类)
适用于情况3这类极端情况
X 推荐文献
[JAVA/Maven/IDEA]解决JAR包冲突的更多相关文章
- Maven中解决jar包冲突的三种方式
首先我们在idea中创建一个maven工程,我们只关注pom.xml以及External Libraries中导入的jar包 导入spring-beans.jar <dependency> ...
- maven 解决jar包冲突及简单使用
maven 解决jar包冲突 1.jar包冲突原因 maven中使用坐标导入jar包时会把与之相关的依赖jar包导入(导入spring-context的jar时就会把spring的整个主体导入) ,而 ...
- Maven 解决JAR包冲突
在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择 “Dependency Hierarchy” 2 ...
- idea升级maven工程jar包版本和解决jar包冲突
原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...
- sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following
一个.问题定义 近期使用sbt战斗assembly发生故障时,包,在package什么时候,发生jar包冲突/文件冲突,两个相同class来自不同jar包classpath内心冲突. 有关详细信息:我 ...
- 三十、详述使用 IntelliJ IDEA 解决 jar 包冲突的问题
在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了.在本文中,我们就一起来看看,如何使用 IntelliJ IDEA 解决 jar 包冲突的问题!简单粗 ...
- mvn解决jar包冲突
转自:http://blog.csdn.net/guanglihuan/article/details/50512855 对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类 ...
- 正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
困扰了两天的问题,非常头疼,今天终于有了解决思路了,说到底,还是对maven不够了解吧.总是抱怨maven不好用,出现各种无厘头的问题,原来这些都是归于对它不够了解不够熟悉,它提供了很好的解决思路,只 ...
- 【原】Maven解决Jar包冲突
一.起源 引入二方jar maven 包后出现 NoSuchMethodError org.apache.commons.lang3.StringUtils.isNoneEmpty . 第一感觉就是j ...
- NoSuchMethodError idea解决jar包冲突
报NoSuchMethodError(使用spring boot框架idea)一般是jar包冲突 Exception in thread"main" java.lang.NoSuc ...
随机推荐
- Python在字典中通过键名查找键值
def find(target, dict_data): """ :param target: 需要查找的键名 :param dict_data: 需要查找的列表 :re ...
- xShell执行js脚本
var CMD = 'ls'; var INTERVAL = 1; var MAX = 5; var CR = String.fromCharCode(13); var LF = String.fro ...
- PLC入门笔记8
梯形图基础电路 起保停电路 多点起保停电路 互锁控制电路 周期闪烁电路 这应该是等价的!! 定时器的接力电路 同 延时接通,延时断开电路 同 保持信号变脉冲信号电路 定时器TON 接通延时变断开延时电 ...
- 井字棋判断输赢C
#include <stdio.h> int main(){ char a[3][3]; for (int i = 0; i < 3; ++i) { for (int j = 0; ...
- PTA一元多项式的乘法与加法运算 另一种算法
设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...
- 1、HTTP的基本概念与交互模型
1.上网的整个过程 假设我们点击了某网页上的一个链接,指向清华大学院系设置,其URL是:http://www.tsinghua.edu.cn/chn/yxsz/index.html.我们来分析一下整个 ...
- linux学习之grep
grep 可进行查找内容 如 cat logs/anyproxy.log | grep "2020080321000049" 还可以通过-v 反向过滤 如 tail -f log ...
- Mongodb可参考的查询
条件AND 1 db.csr_log_info.find({$and:[{enterTime :{$regex:/2021-08-31 18:01/}},{enterTime :{$ne:" ...
- 鸣人的影分身【按照前i个数,最小数是不是0,建立转移方程】
鸣人的影分身 题意 鸣人最多有n个分身,m的能量.分身的能量可以为0. 问有多少种方案数. 思路 很容易定义状态:f[i] [j]: 前i个分身,共花费能量j的方案数. 状态转移:刚开始想的枚举第i个 ...
- NRF52832的FDS程序,参考非蓝牙例程修改而来(需要增加DFU的基础上只要增加如下程序即可解决)
/* Dummy configuration data. */ static configuration_t m_dummy_cfg = { .config1_on = false, .config2 ...