Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jetty-users] ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory

Hello,

I am trying to follow few Jetty 9 websocket tutorials ( like https://webtide.com/jetty-9-updated-websocket-api/ ) and run embedded Jetty with a custom WebSocketListener.

1) https://github.com/afarber/jetty-newbie/blob/master/EmbeddedWebsocket/src/main/java/de/afarber/MyListener.java -

package de.afarber;

import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;

/**
 * Example EchoSocket using Listener.
 */
public class MyListener implements WebSocketListener {
    private Session mSession;

    @Override
    public void onWebSocketBinary(byte[] payload, int offset, int len) {
        /* only interested in text messages */
    }

    @Override
    public void onWebSocketClose(int statusCode, String reason) {
        mSession = null;
    }

    @Override
    public void onWebSocketConnect(Session session) {
        mSession = session;
    }

    @Override
    public void onWebSocketError(Throwable cause) {
        cause.printStackTrace(System.err);
    }

    @Override
    public void onWebSocketText(String message) {
        if (mSession != null && mSession.isOpen()) {
            System.out.printf("Echoing back message [%s]%n",message);
            mSession.getRemote().sendString(message,null);
        }
    }
}

2) https://github.com/afarber/jetty-newbie/blob/master/EmbeddedWebsocket/src/main/java/de/afarber/MyServlet.java -

package de.afarber;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;

public class MyServlet extends WebSocketServlet {

    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        ServletContextHandler context = new ServletContextHandler();
        context.addServlet(MyServlet.class, "/");
        server.setHandler(context);
        server.start();
        server.join();
    }

    @Override
    public void configure(WebSocketServletFactory factory) {
        factory.register(MyListener.class);
    }
}

3) I don't use Jetty Maven Plugin in my https://github.com/afarber/jetty-newbie/blob/master/EmbeddedWebsocket/pom.xml -

because as I have understood, the Jetty Maven Plugin starts Jetty (with "mvn jetty:run") which then scans the webapps dir for war-files - while I want to start "embedded Jetty", which only serves Websocket requests (and add JDBC connection to my PostgreSQL database later):


    <modelVersion>4.0.0</modelVersion>
    <groupId>de.afarber</groupId>
    <artifactId>embedded-websocket</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Embedded Websocket</name>
  
    <properties>
        <jettyVersion>9.3.9.v20160517</jettyVersion>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.websocket</groupId>
            <artifactId>websocket-api</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.websocket</groupId>
            <artifactId>websocket-servlet</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
    </dependencies>
</project>

Also I think that at my production server (with CentOS 7 Linux) I shouldn't use Maven to start the production Jetty...

So I have opened my project with the above 3 files in NetBeans and run it.

Then I have copied the parameters it uses to start the "embedded Jetty" to command line of my Macbook:

# /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -cp /Users/afarber/src/jetty-newbie/EmbeddedWebsocket/target/classes:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-server/9.3.9.v20160517/jetty-server-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-http/9.3.9.v20160517/jetty-http-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-util/9.3.9.v20160517/jetty-util-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-io/9.3.9.v20160517/jetty-io-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-servlet/9.3.9.v20160517/jetty-servlet-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/jetty-security/9.3.9.v20160517/jetty-security-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/websocket/websocket-api/9.3.9.v20160517/websocket-api-9.3.9.v20160517.jar:/Users/afarber/.m2/repository/org/eclipse/jetty/websocket/websocket-servlet/9.3.9.v20160517/websocket-servlet-9.3.9.v20160517.jar de.afarber.MyServlet

2016-05-27 12:32:40.742:INFO::main: Logging initialized @191ms

2016-05-27 12:32:40.831:INFO:oejs.Server:main: jetty-9.3.9.v20160517

2016-05-27 12:32:40.867:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@2a33fae0{/,null,AVAILABLE}

2016-05-27 12:32:40.908:INFO:oejs.AbstractConnector:main: Started ServerConnector@277c0f21{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}

2016-05-27 12:32:40.909:INFO:oejs.Server:main: Started @361ms

So far so good, but when I try to open http://localhost:8080 I get the exception:

2016-05-27 12:33:32.632:WARN:/:qtp1880587981-12: unavailable

java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.load(WebSocketServletFactory.java:66)

at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.create(WebSocketServletFactory.java:44)

at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketServlet.java:130)

at javax.servlet.GenericServlet.init(GenericServlet.java:244)

at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640)

at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:496)

at org.eclipse.jetty.servlet.ServletHolder.ensureInstance(ServletHolder.java:788)

at org.eclipse.jetty.servlet.ServletHolder.prepare(ServletHolder.java:773)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:578)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)

at org.eclipse.jetty.server.Server.handle(Server.java:524)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)

at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)

at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)

at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)

at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)

at java.lang.Thread.run(Thread.java:745)

2016-05-27 12:33:32.633:WARN:oejs.ServletHandler:qtp1880587981-12: 

javax.servlet.ServletException: java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory

at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketServlet.java:142)

at javax.servlet.GenericServlet.init(GenericServlet.java:244)

at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640)

at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:496)

at org.eclipse.jetty.servlet.ServletHolder.ensureInstance(ServletHolder.java:788)

at org.eclipse.jetty.servlet.ServletHolder.prepare(ServletHolder.java:773)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:578)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)

at org.eclipse.jetty.server.Server.handle(Server.java:524)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)

at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)

at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)

at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)

at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)

at java.lang.Thread.run(Thread.java:745)

Caused by: 

java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.load(WebSocketServletFactory.java:66)

at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.create(WebSocketServletFactory.java:44)

at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketServlet.java:130)

at javax.servlet.GenericServlet.init(GenericServlet.java:244)

at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640)

at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:496)

at org.eclipse.jetty.servlet.ServletHolder.ensureInstance(ServletHolder.java:788)

at org.eclipse.jetty.servlet.ServletHolder.prepare(ServletHolder.java:773)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:578)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)

at org.eclipse.jetty.server.Server.handle(Server.java:524)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)

at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)

at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)

at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)

at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)

at java.lang.Thread.run(Thread.java:745)


Am I maybe missing --modules=websocket argument?

I have tried to add it to the above command line, but java does not know it.

Also I have tried to use start.jar:

# java -jar /Users/afarber/src/jetty.project//jetty-distribution/target/distribution/start.jar --module=websocket /Users/afarber/src/jetty-newbie/EmbeddedWebsocket/target/embedded-websocket-0.1-SNAPSHOT.jar

Unrecognized argument: "/Users/afarber/src/jetty-newbie/EmbeddedWebsocket/target/embedded-websocket-0.1-SNAPSHOT.jar" in <command-line>

Please help

Alex



Back to the top