一个线上java.lang.NoSuchMethodError问题的解决

问题描述 :

项目启动时出现java.lang.NoSuchMethodError如下图错误,一样的配置项目在其他服务器及本地跑没有问题 ,故排除代码问题。

问题分析:

查看错误信息 ,全局搜索SpelParserConfiguration类时,发现  spring-expression 和activemq jar包都有这个类,故怀疑是jar包冲突问题,分析原因应该是:jar包的加载是随机的,导致有一台总是失败的。

问题解决:

因为 spring-expression 和activemq jar包都是有用到的,不可能排除依赖。故把spring-expression .jar 移动到$java_home/lib/ext 让其优先加载,测试后成功了。

因为用的是tomcat启动相关应用,参考tomcat 加载顺序:

加载顺序:

1. $java_home/lib 目录下的java核心api 

2. $java_home/lib/ext 目录下的java扩展jar包

3. java -classpath/-Djava.class.path所指的目录下的类与jar包

4. $CATALINA_HOME/common目录下按照文件夹的顺序从上往下依次加载

5. $CATALINA_HOME/server目录下按照文件夹的顺序从上往下依次加载

6. $CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载

7. 我们的项目路径/WEB-INF/classes下的class文件

8. 我们的项目路径/WEB-INF/lib下的jar文件

在同一个文件夹下,jar包是按顺序从上到下依次加载

       由ClassLoader的双亲委托模式加载机制我们可以知道,假设两个包名和类名完全相同的class文件不再同一个jar包,如果一个class文件已经被加载java虚拟机里了,那么后面的相同的class文件就不会被加载了


参考文档:https://blog.csdn.net/budapest/article/details/80751807 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值