问题描述 :
项目启动时出现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