如何在 OSGi 上使用 Jersey 解决 jersey.internal.RuntimeDelegateImpl
How to resolve jersey.internal.RuntimeDelegateImpl with Jersey on OSGi
我正在 OSGi 环境中使用 Jersey。我将所有 Jetty 和 Jersey jar 包装在一个包中,其中还包含我自己的服务器/servlet/资源抽象。这运行很好。我正在通过 OSGi 包导入导入 javax.ws.rs-api,因为相关包也被其他包中的 JAX-RS 资源实现使用。
但是,有时我的实施不适用于 "java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl cannot be found by javax.ws.rs-api_2.1.0"。
这似乎是一个竞争条件。也许 Jersey 有时使用我内部包中的 class,有时使用导入的 javax 中的 class。我真的无法弄清楚问题是什么。
问题类似于[1],但在我的情况下,它与任何导入或依赖无关。我将 Jetty 和 Jersey Jars 包装在一个 OSGi 包中。
[1] org.glassfish.jersey.internal.RuntimeDelegateImpl NOT FOUND
出现此问题是因为 JAX-RS API 使用许多静态方法从 JAX-RS 提供程序获取实现类型。在这种情况下,错误不是来自 Jersey,而是实际上来自 JAX-RS API 本身,当它试图找到各种 JAX-RS 接口的实现时。
您实际上有四个选择:
- 通过将所有资源也放在那里来避免从您的服务器公开 JAX-RS API(我不推荐此选项!)
- 将 JAX-RS API 嵌入到您现有的 Jetty/Jersey uber 包中并从那里导出。请注意包含正确的 API 包版本和合同功能! (这个选项很繁琐)
- 使用 OSGi-aware API 包(例如来自 Apache Aries、Apache Geronimo 或 Apache Service Mix 的包)。许多 Java EE API 包(包括 JAX-RS)将自己打包为 OSGi 包,但忽略了它们实际上需要在 OSGi 中工作的事实,这意味着您不能依赖反射加载 types/resources 来自平面类路径。 (此选项可能是最快的,并且可以让您保持原样工作)
- 转向使用 OSGi Release 7 中的新 OSGi JAX-RS 白板。它的参考实现在 Apache Aries 中,available on GitHub (这是来自 OSGi Release 7 的最佳长期选择OSGi视角,意味着你可以避免维护自己的服务器)
我希望这一切都有意义,解释了为什么您会看到错误,并希望为您提供一些解决问题的选择。
我正在 OSGi 环境中使用 Jersey。我将所有 Jetty 和 Jersey jar 包装在一个包中,其中还包含我自己的服务器/servlet/资源抽象。这运行很好。我正在通过 OSGi 包导入导入 javax.ws.rs-api,因为相关包也被其他包中的 JAX-RS 资源实现使用。
但是,有时我的实施不适用于 "java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl cannot be found by javax.ws.rs-api_2.1.0"。
这似乎是一个竞争条件。也许 Jersey 有时使用我内部包中的 class,有时使用导入的 javax 中的 class。我真的无法弄清楚问题是什么。
问题类似于[1],但在我的情况下,它与任何导入或依赖无关。我将 Jetty 和 Jersey Jars 包装在一个 OSGi 包中。
[1] org.glassfish.jersey.internal.RuntimeDelegateImpl NOT FOUND
出现此问题是因为 JAX-RS API 使用许多静态方法从 JAX-RS 提供程序获取实现类型。在这种情况下,错误不是来自 Jersey,而是实际上来自 JAX-RS API 本身,当它试图找到各种 JAX-RS 接口的实现时。
您实际上有四个选择:
- 通过将所有资源也放在那里来避免从您的服务器公开 JAX-RS API(我不推荐此选项!)
- 将 JAX-RS API 嵌入到您现有的 Jetty/Jersey uber 包中并从那里导出。请注意包含正确的 API 包版本和合同功能! (这个选项很繁琐)
- 使用 OSGi-aware API 包(例如来自 Apache Aries、Apache Geronimo 或 Apache Service Mix 的包)。许多 Java EE API 包(包括 JAX-RS)将自己打包为 OSGi 包,但忽略了它们实际上需要在 OSGi 中工作的事实,这意味着您不能依赖反射加载 types/resources 来自平面类路径。 (此选项可能是最快的,并且可以让您保持原样工作)
- 转向使用 OSGi Release 7 中的新 OSGi JAX-RS 白板。它的参考实现在 Apache Aries 中,available on GitHub (这是来自 OSGi Release 7 的最佳长期选择OSGi视角,意味着你可以避免维护自己的服务器)
我希望这一切都有意义,解释了为什么您会看到错误,并希望为您提供一些解决问题的选择。