【发布时间】:2023-03-11 03:08:02
【问题描述】:
在解决我遇到的另一个问题时,我决定从 Jersey 1.19 升级到 2.22.1,希望我所查看的方向不适用于 1.x,并且升级可以解决我的问题。
在此过程中,我遇到了一个奇怪的问题。我将我的 Maven 依赖项升级到 2.x 并重新编译。那里没有问题。我将所有可以找到的运行时依赖项都放入了我的 Jetty 服务器,但有一件事我被卡住了。当我去运行一个简单的 GET 时,我会得到以下堆栈跟踪:
java.lang.ClassNotFoundException: com.sun.ws.rs.ext.RuntimeDelegateImpl
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:62)
at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:155)
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:105)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:91)
at javax.ws.rs.core.EntityTag.<clinit>(EntityTag.java:35)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at sun.proxy.$Proxy21.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.reflect.Proxy.newInstance(Unknown Source)
at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
at com.sun.jersey.server.impl.application.WebApplicationImpl.createProxy(WebApplicationImpl.java:1592)
at com.sun.jersey.server.impl.application.WebApplicationImpl.<init>(WebApplicationImpl.java:320)
at com.sun.jersey.server.impl.container.WebApplicationProviderImpl.createWebApplication(WebApplicationProviderImpl.java:55)
at com.sun.jersey.spi.container.WebApplicationFactory.createWebApplication(WebApplicationFactory.java:66)
at com.sun.jersey.spi.container.servlet.ServletContainer.create(ServletContainer.java:392)
at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.create(ServletContainer.java:307)
at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:603)
at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)
仅供参考:这是一个非常简单的设置。这只是带有 Jersey servlet 容器的 Jetty。
这个类没有归结为 2.22.1 的依赖项,当我试图找到这可能来自哪个 jar 的引用时,所有内容都指向 jersey-bundle,它似乎不是下面的 jar org.glassfish.jersey.core。 META-INF/services 下的 jersey-server-2.22.1.jar 文件中有一个名为 com.sun.ws.rs.ext.RuntimeDelegateImpl 的文件,其中有一行内容:org.glassfish.jersey.server .internal.RuntimeDelegateImpl
为了好玩,我把 jersey-bundle-1.19.jar 文件扔到了 web 应用程序的 lib 中,中提琴!我的(非常简单的)应用程序像以前一样工作。
我的设置有什么问题吗?我不明白为什么在球衣 2.x 中引用了一个不包含在 Maven 依赖项中的类。
【问题讨论】:
-
我猜测,当您从 Jersey 1.19 升级到 2.22.1 时,您错过了一个依赖项,实际上混合了 1.19 和 2.22.1,这就是它不起作用的原因。添加旧的 1.19 包可能会引入足够多的原始 1.19 依赖项以使其再次工作。当你有 2.22.1 jersey 并寻找 1.19 依赖版本时,你是否尝试过进行依赖项分析?
-
如何显示您的依赖关系以及如何创建服务器。也可以看一个完整的例子here
-
“Jersey 2.x 需要 1.x 库?”。不,但配置完全不同
标签: java maven jersey jetty jax-rs