Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-users] Jetty 8 WebSockets and class loading issue

Is this an embedded use of jetty?

If so, you'll want to configure the classloading in WebAppContext.

Pick one of the techniques below (shouldn't need to use multiple techniques)

Technique #1: systemClasses and serverClasses entries.

How it works ...

systemClasses
  System classes are classes that cannot be replaced by
  the web application, and they are *always* loaded via
  system classloader.

serverClasses
    Server classes are classes that are hidden from being
    loaded by the web application using system classloader,
    so if web application needs to load any of such classes,
    it has to include them in its distribution.

So to essentially have nothing be filtered/excluded at the webapp, and have everything from the server be viewable from the webapp. (quite against the servlet spec btw)...

WebAppContext.setSystemClasses(new String[] { "java.", "javax." });
WebAppContext.setServerClasses(new String[] { "-org.eclipse.jetty" });

Technique #2: make the classloader used for the WebAppContext what you want.

Use WebAppContext.setClassloader(myclassloader);

Technique #3: adjust the parent loader priority.

Use WebAppContext.setParentLoaderPriority(true); // default is false

--
Joakim Erdfelt <joakim@xxxxxxxxxxx>
Developer advice, services and support
from the Jetty & CometD experts


On Mon, Feb 4, 2013 at 11:16 PM, Nikem <gnikem@xxxxxxxxx> wrote:
Hi all!

I am trying to develop a web application, that uses embedded jetty and
websockets. For bootstrapping jetty, I have compiled one uber jar,
jetty.jar, that contains jetty-deploy.jar with all its dependencies
and my launcher class. And then I have the usual exploded webapp,
which I pass to context.setResourceBase(base);

Now I have a problem where to put jetty-websocket.jar. If I include it
to my uber jetty.jar, then application crashes on startup:

13087 WARN  o.e.j.u.component.AbstractLifeCycle - FAILED MyWebSocket:
java.lang.NoClassDefFoundError:
org/eclipse/jetty/websocket/WebSocketServlet
java.lang.NoClassDefFoundError: org/eclipse/jetty/websocket/WebSocketServlet
        at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.6.0_37]
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) ~[na:1.6.0_37]
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615) ~[na:1.6.0_37]
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
~[na:1.6.0_37]
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) ~[na:1.6.0_37]
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58) ~[na:1.6.0_37]
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197) ~[na:1.6.0_37]
        at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:421)
~[jetty.jar:na]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)
~[jetty.jar:na]
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:101) ~[jetty.jar:na]
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:80) ~[jetty.jar:na]
        at org.eclipse.jetty.servlet.Holder.doStart(Holder.java:97) ~[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:298)
~[jetty.jar:na]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:747)
[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
[jetty.jar:na]
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:706)
[jetty.jar:na]
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
[jetty.jar:na]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
[jetty.jar:na]
        at org.eclipse.jetty.server.Server.doStart(Server.java:277) [jetty.jar:na]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
[jetty.jar:na]
        at Launcher.startServer(Launcher.java:53) [T/:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_37]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_37]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_37]
        at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_37]
        at Main.main(Main.java:52) [portal-SNAPSHOT.war:na]
Caused by: java.lang.ClassNotFoundException:
org.eclipse.jetty.websocket.WebSocketServlet
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ~[na:1.6.0_37]
        at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:421)
~[jetty.jar:na]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)
~[jetty.jar:na]
        ... 31 common frames omitted

If I put  jetty-websocket.jar into WEB-INF/lib folder, I get an exception:

29854 WARN  o.e.jetty.servlet.ServletHandler - Error for /pws
java.lang.NoClassDefFoundError: org/eclipse/jetty/io/EndPoint
        at org.eclipse.jetty.websocket.WebSocketServlet.init(WebSocketServlet.java:68)
~[jetty-websocket-8.1.8.v20121106.jar:8.1.8.v20121106]
        at javax.servlet.GenericServlet.init(GenericServlet.java:244) ~[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:519)
~[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:402)
~[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:642)
~[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
[jetty.jar:na]
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
[jetty.jar:na]
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
[jetty.jar:na]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
[jetty.jar:na]
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
[jetty.jar:na]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
[jetty.jar:na]
        at org.eclipse.jetty.server.Server.handle(Server.java:365) [jetty.jar:na]
        at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
[jetty.jar:na]
        at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
[jetty.jar:na]
        at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
[jetty.jar:na]
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
[jetty.jar:na]
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
[jetty.jar:na]
        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
[jetty.jar:na]
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
[jetty.jar:na]
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
[jetty.jar:na]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
[jetty.jar:na]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
[jetty.jar:na]
        at java.lang.Thread.run(Thread.java:680) [na:1.6.0_37]
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.io.EndPoint
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ~[na:1.6.0_37]
        at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:421)
~[jetty.jar:na]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)
~[jetty.jar:na]
        ... 27 common frames omitted

There is not jetty-io in WEB-INF/lib, but it is included in uber jar.
I suspect the notion of WebAppContext's system and server classes is
at play here, but cannot understand it fully.

Should I include jetty-websockets.jar and all it's dependencies into
WEB-INF/lib and not rely on them being provided by server, my uber
jar?

Hope to hear from you soon...
Nikita Salnikov-Tarnovski
_______________________________________________
jetty-users mailing list
jetty-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/jetty-users


Back to the top