Alex,
You're running the code under OSGi?
To me, this looks like the binding-rest-runtime module has not been tested running under OSGi. It
is clearly missing one MAINFEST.MF entry, which causes the ClassNotFound exception you're getting.
I am concerned that there may be more similar failures due to the lack of testing under OSGi.
To fix the particular problem you have here, the following needs to be added to the Import-Package:
section of the MANIFEST.MF for the binding-rest-runtime module:
org.apache.tuscany.sca.interfacedef.java;version=2.0.0,
However, just adding this may well not be enough.
I am not familiar with the binding-rest-runtime module, so it will take me some time to get to grips
with it and make it work properly under OSGi - hopefully someone else from the Tuscany team can take
a look at it more quickly.
Yours, Mike.
Alexander Blotny wrote:
Hi,
I have a problem to export a REST service via an OSGi bundle. Most of
the code is taken from the store example for binding.rest.
(http://tuscany.apache.org/documentation-2x/sca-java-bindingrest.html)
I got following exception:
java.lang.IllegalStateException: java.lang.NoClassDefFoundError:
org/apache/tuscany/sca/interfacedef/java/JavaInterface
at org.apache.tuscany.sca.node.impl.NodeImpl.start(NodeImpl.java:173)
at
org.apache.tuscany.sca.node.osgi.impl.NodeManager.bundleStarted(NodeManager.java:117)
at
org.apache.tuscany.sca.node.osgi.impl.NodeManager.bundleChanged(NodeManager.java:139)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:916)
at
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)
at
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:149)
at
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1350)
at
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1301)
at
org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:362)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.updateWorker(AbstractBundle.java:625)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.update(AbstractBundle.java:572)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.update(AbstractBundle.java:555)
at
org.apache.felix.shell.impl.UpdateCommandImpl.execute(UpdateCommandImpl.java:96)
at
org.apache.felix.shell.impl.Activator$ShellServiceImpl.executeCommand(Activator.java:286)
at
org.apache.felix.shell.tui.Activator$ShellTuiRunnable.run(Activator.java:184)
at java.lang.Thread.run(Thread.java:637)
Caused by: java.lang.NoClassDefFoundError:
org/apache/tuscany/sca/interfacedef/java/JavaInterface
at
org.apache.tuscany.sca.binding.rest.provider.RESTServiceBindingProvider.registerWithJAXRS(RESTServiceBindingProvider.java:217)
at
org.apache.tuscany.sca.binding.rest.provider.RESTServiceBindingProvider.start(RESTServiceBindingProvider.java:143)
at
org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl$1.run(CompositeActivatorImpl.java:423)
at java.security.AccessController.doPrivileged(Native Method)
at
org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl.startEndpoint(CompositeActivatorImpl.java:421)
at
org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl.start(CompositeActivatorImpl.java:377)
at
org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl.start(CompositeActivatorImpl.java:309)
at org.apache.tuscany.sca.node.impl.NodeImpl.start(NodeImpl.java:147)
... 15 more
The bundle has the following structure:
META-INF MANIFEST.MF META-INF/maven META-INF/maven <no contents>
META-INF/maven/de.fhg.fokus.ngni.xposer.see.samples
META-INF/maven/de.fhg.fokus.ngni.xposer.see.samples <no contents>
META-INF/maven/de.fhg.fokus.ngni.xposer.see.samples/helloworld-exporter
pom.properties pom.xml OSGI-INF OSGI-INF <no contents> OSGI-INF/sca
bundle.componentType bundle.composite de de <no contents> de/fhg
de/fhg <no contents> de/fhg/fokus de/fhg/fokus <no contents>
de/fhg/fokus/ngni de/fhg/fokus/ngni <no contents>
de/fhg/fokus/ngni/xposer de/fhg/fokus/ngni/xposer <no contents>
de/fhg/fokus/ngni/xposer/see de/fhg/fokus/ngni/xposer/see <no contents>
de/fhg/fokus/ngni/xposer/see/samples
de/fhg/fokus/ngni/xposer/see/samples <no contents>
de/fhg/fokus/ngni/xposer/see/samples/helloworld Activator.class
HelloREST.class de/fhg/fokus/ngni/xposer/see/samples/helloworld/impl
HelloRESTImpl.class
bundle.composite:
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://calculator.dosgi" name="HelloworldComposite">
<component name="HelloworldComponent">
<tuscany:implementation.osgi
bundleSymbolicName="helloworld-exporter" bundleVersion="0.0.1" />
<service name="HelloworldServiceREST">
<tuscany:binding.rest uri="http://localhost:8087/Helloworld"/
<http://localhost:8087/Helloworld"/>> </service>
</component>
bundle.componentType:
<componentType xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1">
<service name="HelloworldServiceREST"> <interface.java
interface="de.fhg.fokus.ngni.xposer.see.samples.helloworld.HelloREST"/>
</service>
</componentType>
HelloREST.java:
@Remotable public interface HelloREST { @GET String getAll();
@GET @Path("{id}") String getItemById(@PathParam("id")
String itemId); @POST void addItem(Item item); @PUT
void updateItem(Item item); @DELETE @Path("{id}") void
deleteItem(@PathParam("id") String itemId); }
HelloRESTImpl.java:
@Scope("COMPOSITE") public class HelloRESTImpl implements HelloREST {
@Init public void init() {
System.out.println("INIT"); } public void addItem(Item
item) { System.out.println("add"); } public void
deleteItem(String itemId) { System.out.println("delete"); }
public String getAll() { return "ALL"; } public String
getItemById(String itemId) { return itemId; } public void
updateItem(Item item) { System.out.println("update"); } }
Thanks
Alex