OSGi support

184 views
Skip to first unread message

Joe Barnes

unread,
Jan 3, 2013, 5:41:43 PM1/3/13
to scalat...@googlegroups.com
Hey guys,  I saw an old thread regarding supporting OSGi on the group here, but as far as I can tell this has not been done.  I've attempted to "OSGi-ify" the scalatra jars.  Whenever I deploy the scalatra helloworld application in the Apache Karaf 2.3.0 OSGi container and I'm hitting weird issues.  I'm new to OSGi as well as scalatra, so I don't have an idea what might be going on.

I guess my first question is, Will scalatra support OSGi soon? 

Secondly, what might this strange class loader exception mean?

java.lang.NoClassDefFoundError: org/scalatra/servlet/ScalatraListener (wrong name: org/scalatra/RailsRouteMatcher$Builder)
        at java.lang.ClassLoader.defineClass1(Native Method)[:1.6.0_25]
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)[:1.6.0_25]
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)[:1.6.0_25]
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2128)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1432)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_25]
        at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1317)
        at org.apache.felix.framework.BundleWiringImpl.searchImports(BundleWiringImpl.java:1481)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1427)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_25]
        at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1723)
        at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:926)
        at org.ops4j.pax.swissbox.core.BundleClassLoader.findClass(BundleClassLoader.java:176)
        at org.ops4j.pax.swissbox.core.BundleClassLoader.loadClass(BundleClassLoader.java:194)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_25]
        at org.ops4j.pax.web.extender.war.internal.RegisterWebAppVisitorHS.newInstance(RegisterWebAppVisitorHS.java:221)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.
        at org.ops4j.pax.web.extender.war.internal.RegisterWebAppVisitorWC.visit(RegisterWebAppVisitorWC.java:269)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.web.extender.war.internal.model.WebApp.accept(WebApp.java:593)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.web.extender.war.internal.WebAppPublisher$HttpServiceListener.register(WebAppPublisher.java:170)[90:org.ops4j.pax.web.pax-web-extender-war:1.1
        at org.ops4j.pax.web.extender.war.internal.WebAppPublisher$HttpServiceListener.serviceChanged(WebAppPublisher.java:155)[90:org.ops4j.pax.web.pax-web-extender-w
        at org.ops4j.pax.web.extender.war.internal.WebAppPublisher$HttpServiceListener.serviceChanged(WebAppPublisher.java:119)[90:org.ops4j.pax.web.pax-web-extender-w
        at org.ops4j.pax.swissbox.tracker.ReplaceableService.setService(ReplaceableService.java:114)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.tracker.ReplaceableService.access$100(ReplaceableService.java:28)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.tracker.ReplaceableService$CollectionListener.serviceAdded(ReplaceableService.java:183)[90:org.ops4j.pax.web.pax-web-extender-war:1.1
        at org.ops4j.pax.swissbox.tracker.ServiceCollection$Tracker.addingService(ServiceCollection.java:181)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932)[karaf.jar:2.3.0]
        at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)[karaf.jar:2.3.0]
        at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)[karaf.jar:2.3.0]
        at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)[karaf.jar:2.3.0]
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:317)[karaf.jar:2.3.0]
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261)[karaf.jar:2.3.0]
        at org.ops4j.pax.swissbox.tracker.ServiceCollection.onStart(ServiceCollection.java:139)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.lifecycle.AbstractLifecycle$Stopped.start(AbstractLifecycle.java:121)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.lifecycle.AbstractLifecycle.start(AbstractLifecycle.java:49)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.tracker.ReplaceableService.onStart(ReplaceableService.java:146)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.lifecycle.AbstractLifecycle$Stopped.start(AbstractLifecycle.java:121)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.lifecycle.AbstractLifecycle.start(AbstractLifecycle.java:49)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.web.extender.war.internal.WebAppPublisher.publish(WebAppPublisher.java:81)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.web.extender.war.internal.WebXmlObserver.deploy(WebXmlObserver.java:200)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.web.extender.war.internal.WebXmlObserver.addingEntries(WebXmlObserver.java:159)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at org.ops4j.pax.swissbox.extender.BundleWatcher$3.run(BundleWatcher.java:224)[90:org.ops4j.pax.web.pax-web-extender-war:1.1.3]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)[:1.6.0_25]
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)[:1.6.0_25]
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)[:1.6.0_25]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)[:1.6.0_25]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)[:1.6.0_25]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)[:1.6.0_25]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)[:1.6.0_25]
        at java.lang.Thread.run(Thread.java:662)[:1.6.0_25]

Ross A. Baker

unread,
Jan 4, 2013, 12:34:46 AM1/4/13
to scalat...@googlegroups.com
I don't know of any OSGification efforts. I don't know OSGi, but
would be happy to help answer questions and make accommodations if
such an effort were revived.

The little I do know about OSGi is that it's quite finicky about
packages, and I notice that there are two packages involved in your
stack trace. In the non-OSGi world, both live in the core scalatra
jar. Does OSGi impose restrictions on a bundle with multiple
packages, or does it perhaps require some sort of extra metadata?
--
Ross A. Baker
ba...@alumni.indiana.edu
Indianapolis, IN, USA

Joe Barnes

unread,
Jan 4, 2013, 10:57:06 AM1/4/13
to scalat...@googlegroups.com
Hey Ross, thank you for responding.  I don't know a whole lot about OSGi (yet).  I just read about the idea, liked it, put on a helmet and began running with it. :)  

There are no restrictions on multiple packages.  Both of the packages involved are declared as exported in the manifest, so they should work fine.  I've never seen a "wrong name" NoClassDefFoundError where the two classes were entirely different.  

This is probably more of an OSGi question, so I have also posted a new topic at the Karaf forum.

Thanks,
Joe

Joe Barnes

unread,
Jan 27, 2013, 2:37:39 PM1/27/13
to scalat...@googlegroups.com
I finally figured out the issue!  It wasn't related to scalatra at all.  I had created a tool to "osgi-ify" my dependencies, and it wasn't doing it right.  I've detailed it in a blog post for anyone who is interested. http://barnesjd.wordpress.com/2013/01/26/noclassdeffounderror-wrong-name/
Reply all
Reply to author
Forward
0 new messages