Struts从2.5.33升级至6.4.0后仅高阶环境Tomcat9/JDK17关机报错
问题描述
已将Struts从2.5.33版本升级至6.4.0版本,本地环境应用升级后运行正常,但部署到高阶环境时,关机阶段出现如下错误:
4-Aug-2025 08:12:08.196 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesObjectStreamClassCaches Failed to clear soft references from ObjectStreamClass$Caches for web application [gwhwui] java.lang.ClassCastException: class java.io.ObjectStreamClass$Caches$1 cannot be cast to class java.util.Map (java.io.ObjectStreamClass$Caches$1 and java.util.Map are in module java.base of loader 'bootstrap') at org.apache.catalina.loader.WebappClassLoaderBase.clearCache(WebappClassLoaderBase.java:22) at org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesObjectStreamClassCaches(WebappClassLoaderBase:...) at org.apache.catalina.loader.WebappClassLoaderBase.stop(WebappClassLoaderBase.java:1555) at org.apache.catalina.loader.WebappLoader.stopInternal(WebappLoader.java:449)
已执行的操作:
- 根据官方迁移文档修改DTD版本并添加所需jar包;
- 将JDK升级至17版本,Tomcat升级至9.0.87(Red Hat构建版)。
疑问:
- 为何该错误仅在高阶环境出现?
- Struts从2.5迁移至6.4时该如何修复?
问题分析与修复方案
一、仅高阶环境出现错误的原因
这个错误本质是Tomcat类加载器清理缓存时,试图将java.io.ObjectStreamClass$Caches$1强转为java.util.Map,但JDK 17中该内部类的实现已不再是标准Map类型。仅出现在高阶环境的核心原因如下:
- 环境策略差异:高阶生产环境通常启用更严格的资源回收策略,默认开启Tomcat的类缓存清理机制;而本地开发环境可能未开启该逻辑,或者资源回收规则更宽松,不会触发该错误;
- 运行负载差异:高阶环境中应用处理的请求更多,产生的序列化/反序列化操作更频繁,导致
ObjectStreamClass的缓存积累量远大于本地,关机时触发清理逻辑的概率更高; - Tomcat构建版本差异:你使用的Red Hat构建版Tomcat,与本地可能使用的社区版在类加载器实现细节上存在差异,Red Hat 9.0.87版本可能保留了适配旧JDK的缓存清理逻辑,未针对JDK 17做兼容调整。
二、Struts 2.5迁移至6.4的修复方案
针对该错误,可通过以下步骤解决:
- 升级Tomcat版本:Tomcat 9.0.88及以上版本已修复JDK 17下的该类转换问题,建议将Red Hat构建版Tomcat升级到9.0.88+的对应发行版本;
- 禁用Tomcat的ObjectStreamClass缓存清理:在Tomcat的
conf/context.xml中添加配置,关闭该清理逻辑,避免触发错误:<Context> <Loader clearReferencesObjectStreamClassCaches="false"/> </Context> - 适配Struts 6.x序列化机制:Struts 6.x对序列化逻辑做了调整,检查应用中自定义的序列化代码(如使用
ObjectInputStream/ObjectOutputStream的部分),确保适配JDK 17的模块系统,避免依赖旧序列化行为; - 校验依赖完整性:确认Struts 6.4.0的核心依赖(如
struts-core、struts-annotation等)已正确引入,无版本冲突或缺失,防止因依赖问题引发序列化异常。
内容的提问来源于stack exchange,提问作者GANESH NIRANJAN
相关产品推荐
相关产品推荐

