我在 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 的示例代码列表中找到)
此列表包含“appengine-java11 捆绑服务”、“appengine-java11”和“appengine-java17 捆绑服务”。但它不包含“appengine-java17”。
节点“appengine-java11”描述了如何从 public static void main 内部启动 Jetty 实例。
那么这是否意味着(尚)不可能对 Java17 做同样的事情,因此我在黑暗中拍摄?
首先,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 初始化期间,之前的版本会以各种方式失败,通常是默默地失败)。10.0.7
。