OpenJDK11+GWT SDK2.8.2+Jetty9部署Web应用遇503错误求助
排查GWT 2.8.2 + OpenJDK 11 + Jetty 9 出现503服务不可用的问题
我之前也碰到过类似的情况——虽然GWT 2.8.2官方宣称兼容JDK11,但实际和Jetty搭配时总会有一些隐藏的兼容性坑。结合你的情况(JDK8下正常、无编译错误),可以按下面的步骤逐一排查:
1. 先确认GWT 2.8.2对JDK11的实际兼容边界
别完全相信官方文档的“兼容”二字,GWT 2.8.2是JDK11刚发布不久后推出的版本,对JPMS(Java模块系统)的支持很有限:
- 如果你的项目用了
--module-path来管理依赖,建议暂时切换回传统的类路径模式试试,模块系统很可能会干扰GWT的类加载逻辑。 - 检查项目里有没有用到JDK11新增的API,GWT编译器可能能通过编译,但Jetty运行时的类加载器找不到这些类,直接导致服务启动失败。
2. 检查Jetty 9的版本是否适配JDK11
Jetty 9.x对JDK11的支持是从Jetty 9.4.14才开始的,如果你的Jetty版本比这个旧,大概率会出问题。赶紧升级到Jetty 9.4.x的最新稳定版(比如9.4.52.v20230823),旧版本的Jetty在JDK11下的类加载和初始化逻辑有不少bug。
3. 给JVM加些绕开模块化限制的参数
JDK9+的模块化机制会限制GWT Dev Mode的反射调用,必须手动开放权限。在你的Jetty运行配置里添加这些JVM参数:
--add-modules java.se.ee --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.rmi/sun.rmi.transport=ALL-UNNAMED
这些参数能解决大部分因模块化导致的类访问受限问题。
4. 检查GWT模块配置里的坑
打开你的.gwt.xml文件仔细看看:
- 有没有引用JDK11已经移除的模块?比如
javax.xml.bind、javax.annotation这些,JDK11不再自带,你需要手动添加jaxb-api、jaxb-impl这类依赖到项目里。 - 确认
<inherits>标签里的第三方GWT模块是否适配JDK11,有些老的第三方模块还没更新,会在启动时抛出初始化异常。
5. 别忽略Jetty的详细日志
默认的503页面完全没信息量,必须看Jetty的调试日志才能找到根本原因:
- 在Eclipse的Jetty运行配置里,添加VM参数:
-Dorg.eclipse.jetty.LEVEL=DEBUG - 启动后看控制台输出,找启动过程中的
ClassNotFoundException、NoClassDefFoundError这类异常,这些才是导致Jetty无法部署应用、返回503的真凶。
6. 核对Maven/Eclipse的构建配置
Maven项目
确保maven-compiler-plugin和gwt-maven-plugin的配置适配JDK11:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <compilerArgs> <arg>--add-modules=java.se.ee</arg> </compilerArgs> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>gwt-maven-plugin</artifactId> <version>2.8.2</version> <configuration> <sourceLevel>11</sourceLevel> <!-- 其他配置 --> </configuration> </plugin>
Eclipse原生项目
- 确认项目的Java Build Path里的JRE是OpenJDK11,不是JDK8或者其他版本。
- 检查编译输出目录有没有权限问题,有时候Eclipse生成的class文件读不到也会导致启动失败。
- 把Eclipse的GWT插件更新到最新版本,旧插件对JDK11的支持很差。
7. 用最小项目排查法定位问题
如果上面的步骤都没解决,就创建一个最简单的GWT Hello World项目,用同样的JDK11+Jetty9+GWT2.8.2配置运行:
- 如果最小项目正常,说明你的原项目里有特定的依赖或配置导致问题,逐步添加原项目的依赖、模块配置,每次添加后运行,直到复现503,就能定位到具体问题点了。
内容的提问来源于stack exchange,提问作者Nullpointer
相关产品推荐
相关产品推荐

