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

旧javax类库与Jakarta生态的兼容问题如何解决?

Tomcat 10 Jakarta 规范与旧 javax 依赖兼容解决方案

问题根本原因说明

你遇到的java.lang.NoClassDefFoundError错误是因为 Tomcat 10 运行时默认仅内置 Jakarta 规范的类实现,即使项目中引入了 javax.servlet-api 依赖,Tomcat 10 的类加载器也不会加载 javax 前缀的 Servlet 相关类,同时混用两个规范的 API 包还会触发类冲突问题。

可行的兼容方案

方案1:替换为适配 Jakarta 规范的依赖版本

这是长期兼容性最好、改造成本最低的方案:

  • Sitemesh 官方已推出 Jakarta 适配版,直接替换原有依赖为 org.sitemesh:sitemesh:3.2.0 及以上版本即可,该版本已完成全量包名从 javax 到 jakarta 的迁移。
  • Htmlcompressor 官方已停止维护,可直接使用社区适配 Jakarta 的分支版本 com.github.hazendaz:htmlcompressor:1.8.0,功能和原有版本完全一致,仅做了包名适配。

方案2:使用字节码转换工具重写旧依赖的包引用

如果不想替换现有依赖,可以通过 Eclipse Transformer Gradle 插件对旧库做字节码改写,自动将旧依赖中所有 javax. 包引用替换为 jakarta.:

  1. 引入 Gradle 插件:
plugins {
  id 'org.eclipse.transformer' version '0.5.0'
}
  1. 配置转换规则,指定对 Sitemesh、Htmlcompressor 两个依赖执行包名转换,转换后的依赖会自动适配当前 Jakarta 环境,无需额外引入 javax.servlet-api。

方案3:降级到 Tomcat 9(临时过渡方案)

如果项目没有必须使用 Tomcat 10 的强需求,可以直接降级到 Tomcat 9,该版本仍原生支持 javax 规范,无需修改任何现有依赖和业务代码,是成本最低的临时解决方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:54:04