GWT应用从Jetty 9升级到Jetty 11(Java 21)遇类缺失问题求助
GWT + Jetty 11 + Java 21 兼容问题解决方案
解决org.eclipse.jetty.http.HttpURI$Mutable找不到的ClassNotFoundException
- 确认Jetty依赖完整:Jetty 11重构了HTTP模块,
HttpURI$Mutable属于jetty-http核心模块,检查你的依赖配置,确保该模块已正确引入,且所有Jetty依赖版本统一为11.0.16,避免scope设置错误(比如误设为provided导致运行时缺失)。 - 清理旧版Jetty依赖:Jetty 9.4和11的类结构差异极大,项目中残留的9.x依赖会引发冲突。用
mvn dependency:tree(Maven)或gradle dependencies(Gradle)排查依赖树,排除所有Jetty 9.x相关依赖。 - 适配JPMS模块规则:Java 21强制启用模块系统(JPMS),如果项目使用
module-info.java,必须显式声明对Jetty模块的依赖,示例:requires org.eclipse.jetty.http; requires org.eclipse.jetty.server; // 按需添加其他Jetty模块,如org.eclipse.jetty.servlet等
解决编译单元缓存写入失败的IOException
- 修复缓存目录权限:GWT编译缓存默认写入系统临时目录或用户目录,Java 21对文件权限管控更严格,确认运行应用的用户对缓存目录拥有读写权限。也可以手动指定可写的缓存目录:
-Dgwt.cache.dir=/自定义可写路径 - 临时禁用编译缓存:如果权限问题一时无法解决,可临时关闭GWT编译缓存绕开错误,添加启动参数:
注意:禁用缓存会显著减慢编译速度,仅适合调试场景。-Dgwt.nocache=true
GWT与Jetty 11兼容的通用经验
- 升级GWT到适配版本:GWT 2.9.x及更早版本对Jetty 11支持不足,建议升级到GWT 2.10.0及以上,官方在该版本后优化了对新版Jetty和Java 17+的兼容性。
- 调整Jetty启动代码:Jetty 11的API有不少变更,比如
Server初始化、HttpConfiguration配置方式都和9.4不同,对照Jetty 11官方文档调整启动逻辑,替换过时的API调用。 - 统一Java编译与运行版本:确保GWT编译器使用的Java版本和Jetty运行环境的Java 21一致,避免跨版本编译导致的类兼容性问题。
内容的提问来源于stack exchange,提问作者Hansjörg Hofer
相关产品推荐
相关产品推荐

