蓝因子 玩大发了,Tomcat 8.5 升级有坑……
最近某全系统作念了环境升级:
Tomcat 8.5.xJDK 1.8.x
有个系统升级后出现莫得这个要领非常:
threw exception; nested exception is java.lang.NoSuchMethodError:
上线后系统起不来,这下玩大了。。。
咋一看应该是 jar 包冲破了,流程排查,尽然是 jar 包冲破了,类旅途下存在了几个不同版块肖似的 jar 包,是由另外一个依赖引入进来的 compile 依赖,然后摒除冲破的依赖就惩办了。
那么问题来了,既然 jar 包冲破,疏通的环境,为什么在竖立环境、测试环境、预上线环境齐莫得出现问题?
流程查证,那是因为 Tomcat 8 之后的 jar 包加载样式变了,8 之前是按照字母规定加载的,而 8 之后就变了,Tomcat 使用的是 File.listFiles() 要领来获稳健今下的 jar 包,加载的规定就和文献系统复返的规定联系,就不一定是按字母排序了。
java.io.File#listFiles() 源码预防:
这个要领是获稳健今下的所有文献,它不可保证按指定的规定复返效用,绝顶是,不可保证按字母规定复返。为什么腹地环境不错,可能是刚好是按字母排序的了。
那么,这个问题的惩办看法不错是:
1)淌若是冲破问题,摒除冲破依赖惩办 jar 包冲破简略左迁到 tomcat 7 就行了,又简略是写个剧本查验一下包名是否有不异的包;咱们刚好是有两个 jar 包冲破了,惩办冲破就平常了;
2)淌若是业务问题,咱们齐知说念 JVM 双亲托付机制,并吞个类是不可不异加载的,淌若业务确乎需要加载多个版块的依赖,那就需要终了我方的自界说类加载器辨认去加载对应的 jar 包;