GAE Java17独立启动Jetty+Jersey遇HK2类加载异常求助
GAE Java17自主启动Jetty+Jersey问题排查与解决
背景
原Google App Engine(GAE)Java11应用采用Jetty捆绑服务搭配Jersey作为REST服务器,已完成Java17升级部署,现需脱离Jetty捆绑服务,通过应用自主启动Jetty并指定jersey.config.server.provider.packages参数。当前配置可启动Jetty服务器(端口8080),但访问时出现503错误。
当前配置
POM依赖
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.2.3.v20140905</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>9.2.3.v20140905</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-util</artifactId> <version>9.2.3.v20140905</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-webapp</artifactId> <version>9.2.3.v20140905</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.35</version> </dependency> <!-- 重复依赖,需移除 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.35</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.35</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.35</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>2.35</version> </dependency> <!-- 版本不一致,需统一为2.35 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-jetty-http</artifactId> <version>2.35</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> <version>2.35</version> </dependency>
Jetty启动代码
srvtCtxtHdlr = new ServletContextHandler(ServletContextHandler.SESSIONS); srvtCtxtHdlr.setContextPath("/"); wappCtxt = new WebAppContext(); wappCtxt.setContextPath("/"); wappCtxt.setWar(args[0]); jttySrvr = new Server(8080); jttySrvr.setHandler(wappCtxt); try { jttySrvr.start(); jttySrvr.join(); } catch(Exception e) { logger.severe("Exception caught: " + e.getMessage()); e.printStackTrace(); }
错误信息
访问http://localhost:8080时返回503,服务器日志输出:
java.lang.IllegalArgumentException: org.glassfish.hk2.api.ProxyCtl referenced from a method is not visible from class loader: org.jvnet.hk2.internal.DelegatingClassLoader
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.myCompany.myProd.serverApp.fltr.ResponseFilter errors were found
疑问
GAE官方示例包含appengine-java11 bundled service、appengine-java11和appengine-java17 bundled service,但无appengine-java17非捆绑示例,是否意味着Java17无法实现自主启动Jetty?
解决方案
1. 修复依赖问题
- 移除冗余依赖:删除重复的
jersey-common依赖 - 统一Jersey版本:将
jersey-container-servlet-core版本从2.27改为2.35,确保所有Jersey依赖版本一致 - 升级Jetty版本:Jetty 9.2发布于2014年,不兼容Java17,更换为支持Java11+的Jetty 11.x版本(如11.0.18),所有Jetty依赖保持同一版本
2. 解决类加载与依赖注入错误
上述HK2类加载可见性错误,本质是Jetty与Jersey版本不兼容导致的类加载器隔离问题,升级依赖版本后可解决。同时检查ResponseFilter:
- 确保Filter类标注了
@Provider注解,被Jersey扫描到 - 若Filter依赖其他Bean,需确保Bean已被正确注册或可被HK2扫描到
3. 优化Jetty与Jersey集成代码
无需使用WebAppContext加载WAR,直接通过ServletContextHandler注册Jersey Servlet并指定扫描包,示例代码:
public static void main(String[] args) throws Exception { Server jettyServer = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); // 注册Jersey核心Servlet ServletHolder jerseyHolder = context.addServlet(ServletContainer.class, "/*"); jerseyHolder.setInitOrder(0); // 设置Jersey扫描包参数 jerseyHolder.setInitParameter("jersey.config.server.provider.packages", "com.myCompany.myProd.serverApp"); jettyServer.setHandler(context); jettyServer.start(); jettyServer.join(); }
4. GAE Java17支持说明
Java17完全支持自主启动Jetty,官方未提供非捆绑示例仅为文档暂时缺失,不代表功能不支持。按照标准Java Web应用打包部署即可,GAE Java17运行时允许自定义启动类。
内容的提问来源于stack exchange,提问作者Applix Systems
相关产品推荐
相关产品推荐

