gpt4 book ai didi

java - 如何在 OSGi 上使用 Jersey 解析 jersey.internal.RuntimeDelegateImpl

转载 作者:行者123 更新时间:2023-11-29 04:22:00 25 4
gpt4 key购买 nike

我正在 OSGi 环境中使用 Jersey。我将所有 Jetty 和 Jersey jar 包装在一个包中,其中还包含我自己的服务器/servlet/资源抽象。这运行得很好。我正在通过 OSGi 包导入导入 javax.ws.rs-api,因为相关包也被其他包中的 JAX-RS 资源实现使用。

但是,有时我的实现无法使用“java.lang.ClassNotFoundException:org.glassfish.jersey.internal.RuntimeDelegateImpl 无法被 javax.ws.rs-api_2.1.0 找到”。

这似乎是一个竞争条件。也许 Jersey 有时会使用我内部包中的类,有时会使用导入的 javax 中的类。我真的无法弄清楚问题出在哪里。

问题类似于 [1],但在我的情况下,它与任何导入或依赖无关。我将 Jetty 和 Jersey Jars 包装在一个 OSGi 包中。

[1] org.glassfish.jersey.internal.RuntimeDelegateImpl NOT FOUND

最佳答案

出现此问题是因为 JAX-RS API 使用许多静态方法从 JAX-RS 提供程序获取实现类型。在这种情况下,错误不是来自 Jersey,而是当它试图找到各种 JAX-RS 接口(interface)的实现时实际上来自 JAX-RS API 本身。

您实际上有四种选择:

  • 通过将所有资源也放在那里来避免从您的服务器公开 JAX-RS API(我不推荐此选项!)
  • 将 JAX-RS API 嵌入到您现有的 Jetty/Jersey super 包中,并从那里导出。请注意包含正确的 API 包版本和合约功能! (这个选项很繁琐)
  • 使用支持 OSGi 的 API 包(例如来自 Apache Aries、Apache Geronimo 或 Apache Service Mix 的 API 包)。许多 Java EE API 包(包括 JAX-RS)将自己打包为 OSGi 包,但忽略了它们实际上需要在 OSGi 中工作的事实,这意味着您不能依赖于从平面类路径反射加载类型/资源。 (此选项可能是最快的,可以让您继续按原样工作)
  • 开始使用 OSGi Release 7 中的新 OSGi JAX-RS 白板。它的引用实现在 Apache Aries 和 available on GitHub 中。 (从 OSGi 的角度来看,这是最好的长期选择,意味着您可以避免维护自己的服务器)

我希望这一切都是有道理的,解释了为什么您会看到错误,并希望为您提供一些解决问题的选择。

关于java - 如何在 OSGi 上使用 Jersey 解析 jersey.internal.RuntimeDelegateImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com