You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by Dan Gravell <el...@googlemail.com> on 2012/05/03 17:37:29 UTC
Classloading differences between Felix and Eclipse OSGI framework -
running embedded Jetty
I'll start by saying I'm trying to port my application to OSGI to benefit
from in-app update and the potential for auto update. Other benefits from
using OSGI are purely theoretical at this point: they look like
nice-to-haves but I'm concentrating on one thing at a time. I need to
explain that because no doubt what I've done so far is not the OSGI 'way'.
My app traditionally worked using JAR manifests to setup the classpath and
declare the main class. The app embeds Jetty and points it to a web app
which is used to control the application.
My first attempt at OSGI-ing this (with a nod to the purpose outlined in my
opening paragraph) has been to build a monolithic bundle, where the
Activator calls the traditional Main method, which in turn sets up Jetty.
Jetty is imported in the normal Jetty JARs, NOT as an OSGI bundle. I
deployed it in Eclipse's OSGI framework runner (with an empty target
platform, other than the osgi bundle). It worked - I was able to run the
app and even update it by pointing it to a newer version of the bundle.
Then I tried deploying it in Felix, but the Jetty integration doesn't work.
When I start the Jetty server I get some classloading issue loading
HttpServlet.
servlet-api-2.5.jar is declared in the Bundle-Classpath and is present. I
tried adding javax.servlet.http to the Import-Package but that appears to
make no difference. I attached the manifest.
How can I get Jetty up and running?
Here's the full gory exception:
MultiException[java.lang.NoClassDefFoundError:
javax/servlet/http/HttpServlet, java.lang.IllegalStateException: !Selecting]
at org.eclipse.jetty.server.Server.doStart(Server.java:254)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at com.elsten.bliss.main.Main.startJetty(Main.java:591)
at com.elsten.bliss.main.Main.<init>(Main.java:263)
at com.elsten.bliss.main.Main.<init>(Main.java:211)
at com.elsten.bliss.main.Main.startup(Main.java:199)
at com.elsten.osgi.Activator.start(Activator.java:27)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)
at com.elsten.bliss.runtime.osgi.Main.installAndStartBundles(Main.java:76)
at com.elsten.bliss.runtime.osgi.Main.main(Main.java:32)
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:415)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:415)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
at org.eclipse.jetty.util.Loader.loadClass(Loader.java:92)
at org.eclipse.jetty.util.Loader.loadClass(Loader.java:71)
at org.eclipse.jetty.servlet.Holder.doStart(Holder.java:84)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:262)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at
org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:770)
at
org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249)
at
org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1214)
at
org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:676)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:455)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at
org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at
org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
at org.eclipse.jetty.server.Server.doStart(Server.java:261)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at com.elsten.bliss.main.Main.startJetty(Main.java:591)
at com.elsten.bliss.main.Main.<init>(Main.java:263)
at com.elsten.bliss.main.Main.<init>(Main.java:211)
at com.elsten.bliss.main.Main.startup(Main.java:199)
at com.elsten.osgi.Activator.start(Activator.java:27)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)
at com.elsten.bliss.runtime.osgi.Main.installAndStartBundles(Main.java:76)
at com.elsten.bliss.runtime.osgi.Main.main(Main.java:32)
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:415)
at
org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
... 48 more
java.lang.IllegalStateException: !Selecting
at
org.eclipse.jetty.io.nio.SelectorManager.doStart(SelectorManager.java:309)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at
org.eclipse.jetty.util.component.AggregateLifeCycle.doStart(AggregateLifeCycle.java:58)
at
org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:319)
at
org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:251)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.server.Server.doStart(Server.java:272)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at com.elsten.bliss.main.Main.startJetty(Main.java:591)
at com.elsten.bliss.main.Main.<init>(Main.java:263)
at com.elsten.bliss.main.Main.<init>(Main.java:211)
at com.elsten.bliss.main.Main.startup(Main.java:199)
at com.elsten.osgi.Activator.start(Activator.java:27)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)
at com.elsten.bliss.runtime.osgi.Main.installAndStartBundles(Main.java:76)
at com.elsten.bliss.runtime.osgi.Main.main(Main.java:32)