2016-10-14 23 views
1

我在Apache Karaf中安装并激活了泽西服务器2.19捆绑包(和依赖关系),以创建一个简单的web应用程序(/ tracks/get,它产生一个Track对象的json表示与简单的名字和艺术家领域)。Karaf OSGI环境中的Jersey网络应用程序不起作用

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

当我发动战争捆我得到以下异常:

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] 

这我相信就是为什么我的web应用程序不能正常工作的原因。

看来,球衣正在检查我注释的服务类,并在某些时候它需要一个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包的一部分,它被激活并且Export-Package:有这个包。

回答

0

通过将我的Jersey应用程序直接注册到osgi http服务来修复它。

0

不知道球衣是否可以在卡拉夫箱中使用。在karaf中执行REST的典型方法是使用Apache CXF。 CXF为REST提供蓝图名称空间,并基于导出的OSGi服务提供​​。

如果你想使用泽西岛,那么有osgi-jaxrs-connector。 它和CXF-DOSGi做类似的事情。

+0

感谢您的建议。目前我们需要使用泽西岛。 –

相关问题