TongWeb78处理应用自身JAR包冲突思路

通常应用运行时报错如果出现java.lang.NoClassDefFoundError,那么首先需要看报错日志下方的Caused by内容是什么,如果是ClassNotFoundException,那么原因就是缺少某个类。如果仍然是NoClassDefFoundError,那么很大可能是类冲突导致的。此时就需要继续排查是哪些jar包冲突。

第二种类冲突的报错不是那么明显,需要反编译jar包查看源码,比如下面两张图中的报错。

图一中显示的是NoSuchMethodError,说javax.mail.internet.ParameterList类中没有combineSegments方法。如果已知这个类在哪个jar包中,只需要查看源码就行。如果发现该类有这个方法,那么基本可以判断是类冲突,在其他jar包中会有一个相同的类但是没有这个方法。

如果查看的jar包中的类没有这个方法,往往会造成误判,认为是应用使用的jar包问题,因为事实情况与报错信息一致。但是不能忽略一种可能,在其他jar包中有一个相同的类,并且这个类有这个方法,只是应用启动时加载的类不是它而已。此时就需要去搜索是否有这个相同类存在。

可以通过这个命令查询:find ./ | xargs grep "类名" > 11.txt

图一

图二的情况与图一类似,也不是很明显的能判断出是类冲突造成的问题。从报错信息看是说子类没有实现抽象父类的方法。实际通过jar包查看源码也确实如报错信息所述一致。但是通过搜索子类和父类后发现,父类UriBuilder分别在两个jar包中出现,由此可以判断是类冲突导致的问题。

图二

其他方式检测类冲突:

如果使用TongWeb7.0产品,可以通过控制台==》类加载分析工具==》类资源分析/类冲突检测

如何处理冲突的jar包:

1、最直接的方法是将冲突的jar包删除

2、修改TongWeb配置

TongWeb7.0:在应用WEB-INF里面加入tongweb-web.xml文件。内容如下:需要优先加载的jar包放在前面。

<?xml version="1.0" encoding="UTF-8"?>

<tongweb-web-app>

<jar-orders>

<jar-order jar-name="a.jar" />

<jar-order jar-name="b.jar" />

</jar-orders>

</tongweb-web-app>

TongWeb8.0:部署应用的时候,在资源加载界面中设置加载顺序。

相关推荐
Ryan ZHENG3 天前
[Android][踩坑]Android Studio导入core-libart.jar
android·android studio·jar
q***13343 天前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
晓华-warm4 天前
Warm-Flow 1.8.4 票签新增多种通过率策略!
java·中间件·流程图·jar·开源软件·工作流
悟能不能悟6 天前
docker怎么运行jar包
docker·容器·jar
q***13617 天前
SpringSecurity相关jar包的介绍
java·jar
麦烤楽鸡翅7 天前
坚持60s (攻防世界)
java·网络安全·jar·ctf·misc·反编译·攻防世界
q***65698 天前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
小杨互联网11 天前
JAR逆向工程实战对比:传统工具 vs 自动化解决方案
运维·自动化·jar·jar自动逆向工具·jar逆向源码
听风吟丶11 天前
Java 9+ 模块化系统(Jigsaw)实战:从 Jar 地狱到模块解耦的架构升级
java·架构·jar
搬山境KL攻城狮13 天前
maven 私服上传jar
java·maven·jar