Java 如何在OSGi上使用jersey解析jersey.internal.RuntimeDelegateImpl

Java 如何在OSGi上使用jersey解析jersey.internal.RuntimeDelegateImpl,java,jersey,jetty,jax-rs,osgi,Java,Jersey,Jetty,Jax Rs,Osgi,我正在OSGi环境中使用Jersey。我将所有Jetty和Jersey jar打包在一个包中,其中还包含我自己的服务器/servlet/资源抽象。这运行得很好。我通过OSGi包导入javax.ws.rs-api,因为其他捆绑包中的JAX-rs资源实现也使用相关包 但是,我的实现有时无法使用“javax.ws.rs-api_2.1.0找不到java.lang.ClassNotFoundException:org.glassfish.jersey.internal.RuntimeDelegateIm

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

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

看来这可能是一种比赛条件。也许Jersey有时使用我的内部包中的类,有时使用导入的javax中的类。我真的搞不懂问题出在哪里

这个问题类似于[1],但在我的例子中,它与任何导入或依赖关系无关。我把防波堤和球衣罐包在一个OSGi包里


[1]

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

实际上,您有四种选择:

  • 通过将所有资源也放在服务器中,避免从服务器公开JAX-RSAPI(我不建议使用此选项!)
  • 在现有Jetty/Jersey uber捆绑包中嵌入JAX-RS API,并从中导出。请注意包含正确的API包版本和合同功能!(此选项非常灵活)
  • 使用支持OSGi的API包(例如来自ApacheAries、ApacheGeronimo或ApacheServiceMix的API包)。许多JavaEEAPI包(包括JAX-RS)将自己打包为OSGi包,但忽略了一个事实,即它们实际上需要在OSGi中工作,这意味着您不能依赖于从平面类路径反射加载类型/资源。(此选项可能是最快的,可以让您保持原样工作)
  • 从OSGi版本7开始使用新的OSGi JAX-RS白板。这方面的参考实现是在ApacheAries中实现的(从OSGi的角度来看,这是最好的长期选项,这意味着您可以避免维护自己的服务器)

我希望这一切都是有意义的,解释了您看到错误的原因,并希望为您提供一些解决问题的选项。

问题的可能重复类似,但在我的情况下,这与任何导入或依赖性无关。我将Jersey罐子包装在一个OSGi包中。我目前正在测试:RuntimeDelegate.setInstance(new org.glassfish.Jersey.internal.RuntimeDelegateImpl()。然而,为了100%的安全和找到正确的解决方案,我真的很想了解这个问题。谢谢你的解释和选择!目前,在服务器捆绑包的启动阶段使用“RuntimeDelegate.setInstance(new org.glassfish.jersey.internal.RuntimeDelegateImpl())”时,我再也没有错误了。这是否也是一个潜在的解决方案?与重新打包的API包有什么不同。我已经在使用javax.ws.rs-api_2.1.0了,它似乎对OSGi很敏感。它被添加到目标平台,并且包包含在我的服务器包中。与原始API包相比,我无法确定aries API包中有任何特定的更改(选项三):设置显式RuntimeDelegate会起作用,但不是一个非常模块化的解决方案(不同的实现可能会相互冲突,并且存在潜在的排序问题)