【问题标题】:Jersey 2.x Requires 1.x libs?Jersey 2.x 需要 1.x 库?
【发布时间】: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 依赖项中的类。

【问题讨论】:

  • 正如@peeskillet 在other Stackoverflow 问题中指出的那样,don't mix Jersey 1.x 和 Jersey 2.x 在同一个项目中。
  • 我猜测,当您从 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


【解决方案1】:

我将 jersey 1.x jar 放入 Jetty 的扩展文件夹中,但这个 jar 除外。我也未能在我的 web.xml 中将 servlet 类更新为 org.glassfish.jersey.servlet.ServletContainer。这就是我仍然获得 1.x 依赖项的原因。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多