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

升级Java11+Tomcat10时Struts ActionServlet适配Jakarta问题求助

Struts 1 升级 Tomcat 10/Java 11 问题答复

关于Jakarta适配版Struts ActionServlet的说明

不存在官方发布的导入jakarta.servlet.*包的org.apache.struts.action.ActionServlet版本。
Struts 1.x早在2008年就已终止官方维护,所有官方发行的Struts 1版本(包括最新的1.3.10)全部基于Java EE的javax.servlet.*命名空间开发,没有任何官方渠道提供适配Jakarta EE命名空间的版本。你提到的Struts 2.x系列和Struts 1核心架构不兼容,不存在可直接替换的ActionServlet实现。
你对异常根因的判断完全准确:自定义Servlet子类即便修改了导入包,只要父类Struts ActionServlet仍然实现javax.servlet.Servlet接口,整个类就无法被Tomcat 10(仅识别jakarta.servlet.Servlet实现类)加载,最终抛出ClassCastException。

报错核心日志:

22-Jun-2022 11:29:26.084 SEVERE [main] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [action] in web application [/xxware] threw load() exception
java.lang.ClassCastException: class com.xxxxxx.ui.web.jspframework.XxxxxxWebActionServlet cannot be cast to class jakarta.servlet.Servlet

可落地的解决方案

按改造成本从低到高排序,可选择以下方案:

  • 方案1:换用Tomcat 9作为运行环境(成本最低,优先推荐)
    Tomcat 9完全兼容Java 11,且采用javax.servlet.*命名空间,和你现有Struts 1的技术栈完全匹配。你只需要处理原有Java 6代码到Java 11的编译兼容问题(比如移除废弃API调用、调整JVM启动参数),不需要修改任何Servlet、Struts相关代码,直接部署即可稳定运行,是无强制Tomcat 10要求场景下的最优选择。
  • 方案2:通过字节码转换统一命名空间
    如果必须使用Tomcat 10,可以在构建阶段用字节码转换工具,把Struts依赖包、项目中所有引用javax.servlet.*的字节码批量替换为jakarta.servlet.*,确保整个应用内所有Servlet相关引用全部统一到Jakarta命名空间即可解决类型转换问题。转换时需要覆盖所有依赖servlet API的第三方jar,不要遗漏,避免出现混用命名空间的问题。Tomcat官方也提供了对应的应用迁移工具,可以直接对打包完成的WAR包做批量转换,不需要修改源码。
  • 方案3:自行适配Struts核心类
    如果不想引入字节码转换工具,可以把你项目用到的Struts 1核心类(核心就是ActionServlet,以及配套的请求处理、过滤器相关类)源码抽出,将源码中所有javax.servlet的导入声明替换为jakarta.servlet,编译后作为本地依赖替换原有官方Struts jar即可。Struts 1核心逻辑简单稳定,这部分替换不需要改动业务逻辑,工作量可控,后续如果用到其他Struts扩展组件,做同样的包名替换即可。
  • 方案4:长期架构迭代替换
    如果该服务后续有长期迭代需求,可以规划逐步将Struts 1的逻辑迁移到仍在维护的现代MVC框架,从根源上解决老旧技术栈的兼容和安全问题,该方案改造成本最高,适合作为长期规划。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:12:31