玩大发了,Tomcat 8.5 升级有坑…

简介: 最近某全系统做了环境升级:Tomcat 8.5.xJDK 1.8.x

最近某全系统做了环境升级:

  • Tomcat 8.5.x
  • JDK 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() 源码注释:

image.png

这个方法是获取目前下的所有文件,它不能保证按指定的顺序返回结果,特别是,不能保证按字母顺序返回。为什么本地环境可以,可能是刚好是按字母排序的了。


那么,这个问题的解决办法可以是:


1)如果是冲突问题,排除冲突依赖解决 jar 包冲突或者降级到 tomcat 7 就行了,又或者是写个脚本检查一下包名是否有重复的包;我们刚好是有两个 jar 包冲突了,解决冲突就正常了;


2)如果是业务问题,我们都知道 JVM 双亲委派机制,同一个类是不能重复加载的,如果业务确实需要加载多个版本的依赖,那就需要实现自己的自定义类加载器分别去加载对应的 jar 包;


关于类加载器、双亲委派机制都可以在Java技术栈公众号往期文章找到相对应的解答。



相关文章
|
5月前
|
应用服务中间件 Shell
tomcat版本自动升级脚本
请注意,这只是一个简单的示例脚本,用于演示自动升级Tomcat版本的思路。实际部署中,您可能需要根据您的环境和需求对脚本进行更详细的定制和错误处理。确保在升级Tomcat版本之前备份重要数据和配置文件,以防止意外情况发生。
54 0
|
5月前
|
前端开发 Java 应用服务中间件
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
|
Kubernetes 负载均衡 Java
Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离 | 学习笔记
快速学习 Kubeadm 升级 k8s 至 v1.17.4及运行 nginx+tomcat 并实现动静分离
|
Kubernetes Java 应用服务中间件
|
应用服务中间件
tomcat升级版本为8.5.68后.启动报错: java.lang.IllegalArgumentException: AJP连接器配置secretRequired=“true”
ttomcat升级版本为8.5.68后.启动报错: java.lang.IllegalArgumentException: AJP连接器配置secretRequired=“true” 属性secret确实为空 1.tomcat启动报错内容如下
896 0
tomcat升级版本为8.5.68后.启动报错: java.lang.IllegalArgumentException: AJP连接器配置secretRequired=“true”
|
存储 应用服务中间件 网络安全
cas-overlay-template 5.3.9 + Nginx + Tomcat 8 + Let's encrypt 免费 SSL 升级 https
申请证书 https://yq.aliyun.com/articles/713724?spm=a2c4e.11155435.0.0.5a9f33121vK849 将SSL证书由 .pem 格式转换成 Tomcat 所支持的 .
2014 0
|
JavaScript Java 应用服务中间件
记一次升级Tomcat
记一次升级Tomcat 总述     JDK都要出12了,而我们项目使用的jdk却仍然还停留在JDK1.6。为了追寻技术的发展的脚步,我这边准备将项目升级到JDK1.8。而作为一个web项目,我们的容器使用的是Tomcat。
2710 0
|
XML Java 数据格式
升级log4j2,tomcat--7.0.16 启动就OOM,蛋疼的问题
升级log4j2 ,官网说要web.xml里的 version 属性改成3.0,发现改了之后,一起动就报错OOM, Exception in thread "main"  Exception: java.
1507 0
|
Web App开发 JavaScript 前端开发
网站升级为https过程记录-tomcat
1.创建.keystore [root@centos apache-tomcat-6.0.37]# keytool -genkey -alias tomcat -keyalg RSA -keystore /root/tomcat/apache-tomcat-6.
955 0