2016-10-14 8 views
1

Apache KarafのJerseyサーバー2.19バンドル(および依存関係)をインストールして有効にして、単純なWebアプリケーション(/ tracks/getはTrackオブジェクトのjson表現を生成します)を作成しました単純な名前とアーティストフィールドを持つ)。Karaf OSGI環境のJersey Webアプリケーションは動作しません

私はwarファイルのバンドル版を作成し、それをKarafにインストールしました。

私は戦争バンドルを起動すると、私は次の例外を取得:

私は私のWebアプリケーションが動作しない理由であると推定
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] 

ジャージが私の注釈付きサービスクラスを検査していると思われ、ある時点で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

ジャージー・アプリケーションをosgi httpサービスに直接登録することで修正しました。

0

ジャージーがカラフで箱から出ているかどうかはわかりません。 karafでRESTを行う典型的な方法は、Apache CXFを使用することです。 CXFは、エクスポートされたOSGiサービスに基づいて、REST用の青写真名前空間と​​を提供します。

ジャージーを使用する場合は、osgi-jaxrs-connectorがあります。 CXF-DOSGiと同様のことをします。

+0

提案していただきありがとうございます。当分の間、ジャージーを使用する必要があります。 –

関連する問題