/ / Jersey Web App in Karaf OSGI-Umgebung funktioniert nicht - Java, Osgi, Jersey-2.0, Karaf

Jersey Web App in Karaf OSGI Umgebung funktioniert nicht - Java, OSGI, Jersey-2.0, Karaf

Ich habe den Trikotserver 2 installiert und aktiviert.19 Bundles (und Abhängigkeiten) in Apache Karaf, um eine einfache Webapp zu erstellen (/ tracks / get, die eine json-Darstellung eines Track-Objekts mit einfachen Namens- und Interpretenfeldern erzeugt).

Ich habe eine Bundle-Version meiner Kriegsdatei erstellt und in Karaf installiert.

Wenn ich das Kriegsbündel starte, bekomme ich folgende Ausnahme:

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]

was ich vermute ist der grund warum meine webapp nicht funktioniert.

Es scheint, dass Trikot meine kommentierten inspiziertService-Klasse und irgendwann benötigt es eine RuntimeDelegateImpl-Instanz. Dieser Code stammt aus dem Paket org.glassfish.jersey.server. Die RuntimeDelegateImpl-Klasse wird über Class.forName (). NewInstance () im Code aus dem javax.ws.rs.ext-Bundle instanziiert. Das Grundproblem ist, dass der Classloader des javax.ws-Bundles den org.glassfish.jersey.server.internal.RuntimeDelegateImpl nicht im Klassenpfad findet. Ich verstehe aber nicht, wie das ist, da diese Klasse Teil der Organisation ist .glassfish.jersey.server Bundle welches aktiviert ist und Export-Package: hat dieses Paket.

Antworten:

0 für die Antwort № 1

Ich bin mir nicht sicher, ob das Trikot in Karaf sofort funktioniert. Die typische Methode für REST in Karaf ist die Verwendung von Apache CXF. CXF bietet auch Blueprint-Namespaces für REST an CXF-DOSGi, das REST-Endpunkte exportieren kann basierend auf exportierten OSGi-Diensten.

Wenn Sie Trikot verwenden möchten, dann gibt es die Osgi-Jaxrs-Stecker. Welches macht eine ähnliche Sache wie CXF-DOSGi.


0 für die Antwort № 2

Es wurde behoben, indem meine Jersey-Anwendung direkt im osgi http-Dienst registriert wurde.