java - Karaf OSGI 环境中的 Jersey Web 应用程序无法运行

标签 java osgi jersey-2.0 karaf

我在 Apache Karaf 中安装并激活了 Jersey 服务器 2.19 包(和依赖项),以便创建一个简单的 Web 应用程序(/tracks/get ,它生成具有简单名称和艺术家字段的 Track 对象的 json 表示形式)。

我创建了 war 文件的捆绑版本并将其安装在 Karaf 中。

当我启动 war 包时,出现以下异常:

2016-10-14 10:35:08,299 | DEBUG | pool-4-thread-1  | FactoryFinder                    | 84 - javax.ws.rs-api - 2.0.1 | Unable to load provider class org.glassfish.jersey.server.internal.RuntimeDelegateImpl using custom classloader org.ops4j.pax.web.service.spi.util.ResourceDelegatingBundleClassLoader trying again with current classloader.
java.lang.ClassNotFoundException: org.glassfish.jersey.server.internal.RuntimeDelegateImpl
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
    at org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:340)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
    at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1212)
    at org.ops4j.pax.swissbox.core.BundleClassLoader.findClass(BundleClassLoader.java:176)[60:org.ops4j.pax.swissbox.core:1.7.0]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)[:1.7.0_21]
    at org.ops4j.pax.swissbox.core.BundleClassLoader.loadClass(BundleClassLoader.java:192)[60:org.ops4j.pax.swissbox.core:1.7.0]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
    at java.lang.Class.forName0(Native Method)[:1.7.0_21]
    at java.lang.Class.forName(Class.java:266)[:1.7.0_21]
    at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:107)[84:javax.ws.rs-api:2.0.1]
    at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:166)[84:javax.ws.rs-api:2.0.1]
    at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:135)[84:javax.ws.rs-api:2.0.1]
    at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)[84:javax.ws.rs-api:2.0.1]
    at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179)[84:javax.ws.rs-api:2.0.1]
    at org.glassfish.jersey.server.model.IntrospectionModeller.extractMediaTypes(IntrospectionModeller.java:280)[102:org.glassfish.jersey.core.jersey-server:2.19.0]
    at org.glassfish.jersey.server.model.IntrospectionModeller.extractMediaTypes(IntrospectionModeller.java:269)[102:org.glassfish.jersey.core.jersey-server:2.19.0]

我认为这就是我的网络应用程序无法工作的原因。

jersey 似乎正在检查我带注释的服务类,并且在某些时候它需要一个 RuntimeDelegateImpl 实例。此代码来自 org.glassfish.jersey.server 包。 RuntimeDelegateImpl 类通过 javax.ws.rs.ext 包中的代码中的 Class.forName().newInstance() 进行实例化。 根本问题是 javax.ws 包的类加载器在类路径中找不到 org.glassfish.jersey.server.internal.RuntimeDelegateImpl。但我不明白这是怎么回事,因为该类是 org.glassfish.jersey.server bundle 的一部分,该 bundle 已激活并且 Export-Package: 具有该包。

最佳答案

不确定 Jersey 是否可以在 Karaf 中开箱即用。在 karaf 中执行 REST 的典型方法是使用 Apache CXF。 CXF 为 REST 以及 CXF-DOSGi which can export REST endpoints 提供蓝图命名空间基于导出的 OSGi 服务。

如果你想使用 Jersey ,那么有osgi-jaxrs-connector 。 其功能与 CXF-DOSGi 类似。

关于java - Karaf OSGI 环境中的 Jersey Web 应用程序无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40039870/

相关文章:

java - 自定义 Eclipse 格式化程序以删除不必要的大括号

java - OSGI 是一个好的选择吗?

jersey-2.0 - 无法通过 @Context jersey2.x 和 weblogic 12.1.3 在 ContainerRequestFilter 中注入(inject) HttpServletRequest

java - 带有 Jersey 2.2 和 Jackson 2.1 的自定义 ObjectMapper

java - 在 ant 中设置 javaagent

java - 在 Java 中使用翻转参数调用方法

java - 使用 Maven、OSGi 和 Bndtools

java - OSGi 中的 JCE 安全提供者

java - 为什么依赖注入(inject)仅适用于 Jersey 的资源类

java - 如何跟踪 Joda 日期缓冲区中的非空字段