带有 Jersey 的 Google App Engine 嵌入式 Jetty,Java 17

问题描述 投票:0回答:1

我在 Google App Engine 上有一个 Java11 应用程序,它使用 Jetty“捆绑服务”,并以 Jersey 作为 REST 服务器。

Google 云控制台上有警告,要求在 2024 年 10 月 31 日之前从 Java1 迁移到 Java17。

因此我将代码从 Java11 更改为 Java17 并部署了该应用程序。控制台警告消失了。到目前为止,一切都很好。

但是,我的应用程序仍然使用 Jetty“捆绑服务”和 Jersey 作为 REST 服务器。但是,如果我想启动一个 Java 应用程序,并从该 Java 应用程序启动一个 Jetty 服务器,并在启动该 Jetty 实例时指定“jersey.config.server.provider.packages”,该怎么办?

换句话说,就 Jetty 而言,我想放弃“捆绑服务”。

我尝试了 Jetty 和 Jersey 版本的几种组合,最后 pom 中的这些条目起作用了,Java 应用程序启动了,然后它又在端口 8080 上启动了 Jetty 服务器。

<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>
<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>

这是 public static void main 方法中的代码....

     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:在尝试解析 com.myCompany.myProd.serverApp.fltr.ResponseFilter 的依赖项时发现错误

对我可能出错的地方有什么建议吗?

另请注意以下事项(可以在GAE 的示例代码列表中找到)

list of samples

此列表包含“appengine-java11 捆绑服务”、“appengine-java11”和“appengine-java17 捆绑服务”。但它不包含“appengine-java17”。

节点“appengine-java11”描述了如何从 public static void main 内部启动 Jetty 实例。

那么这是否意味着(尚)不可能对 Java17 做同样的事情,因此我在黑暗中拍摄?

google-app-engine jersey jetty java-17
1个回答
0
投票

首先,Jetty 9.x 已终止生命周期。 (Jetty 10 和 Jetty 11 也是如此) 此时您应该使用受支持的 Jetty 版本。 Jetty 12 就是该版本(是的,您可以在 Jetty 12 上使用

javax.servlet
ee8
环境。

接下来,Jetty

9.2.3.v20140905
不支持您的依赖项或 Java 版本中存在的功能。

  • Jetty 9.4.9.v20180320
    中正确支持 Java 版本 9 以后的版本(由于 JVM 中的类加载器和字节码扫描更改,在 servlet 初始化期间,之前的版本会以各种方式失败,通常是默默地失败)。
  • Jetty 首先正确支持 Java 版本 17
    10.0.7
© www.soinside.com 2019 - 2024. All rights reserved.