You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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构建版)。

疑问:

  1. 为何该错误仅在高阶环境出现?
  2. 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的修复方案

针对该错误,可通过以下步骤解决:

  1. 升级Tomcat版本:Tomcat 9.0.88及以上版本已修复JDK 17下的该类转换问题,建议将Red Hat构建版Tomcat升级到9.0.88+的对应发行版本;
  2. 禁用Tomcat的ObjectStreamClass缓存清理:在Tomcat的conf/context.xml中添加配置,关闭该清理逻辑,避免触发错误:
    <Context>
        <Loader clearReferencesObjectStreamClassCaches="false"/>
    </Context>
    
  3. 适配Struts 6.x序列化机制:Struts 6.x对序列化逻辑做了调整,检查应用中自定义的序列化代码(如使用ObjectInputStream/ObjectOutputStream的部分),确保适配JDK 17的模块系统,避免依赖旧序列化行为;
  4. 校验依赖完整性:确认Struts 6.4.0的核心依赖(如struts-core、struts-annotation等)已正确引入,无版本冲突或缺失,防止因依赖问题引发序列化异常。

内容的提问来源于stack exchange,提问作者GANESH NIRANJAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:12:16