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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:44:55