WebSockets with Embedding Jetty



我实现了这个链接中解释的例子。不过我用scala重写了一下。但是我得到java.lang。NoClassDefFoundError: org/eclipse/jetty/io/nio/AsyncConnection error.

这是我的RoomWebSocketHandler类:
import java.io.IOException
import javax.servlet.http.HttpServletRequest
import org.eclipse.jetty.websocket.WebSocket.Connection
import org.eclipse.jetty.websocket.{WebSocket, WebSocketHandler}
import scala.collection.mutable
class RoomWebSocketHandler extends WebSocketHandler {
  private val webSockets = new mutable.ArrayBuffer[StateWebSocket]()
  override def doWebSocketConnect(request: HttpServletRequest, protocol: String): WebSocket = {
    new StateWebSocket()
  }
  private class StateWebSocket extends WebSocket.OnTextMessage {
    var connection: Connection = _
    def onOpen(connection: Connection) {
      this.connection = connection
      webSockets += this
    }
    def onMessage(data: String) {
      try {
        for (webSocket <- webSockets) {
          webSocket.connection.sendMessage(data)
        }
      } catch {
        case x: IOException => this.connection.close()
      }
    }
    def onClose(closeCode: Int, message: String) {
      webSockets -= this
    }
  }
}

这是我的主类:

import java.net.InetSocketAddress
import grizzled.slf4j.Logger
import org.eclipse.jetty.server.{Handler, Server}
import org.eclipse.jetty.server.handler.{DefaultHandler, HandlerList, ResourceHandler}
import org.eclipse.jetty.servlet.ServletContextHandler
object Main {
  var jettyServer: Option[Server] = None
  def startServer(): Unit = {
    val LOCAL_PORT = 4041
    logger.debug("startServer begin")
    jettyServer match {
      case Some(s) =>
        logger.info("Server is already running")
        logger.debug("startServer end")
        return
      case None =>
        logger.info("Server is not running")
    }
    val server = new Server(new InetSocketAddress("127.0.0.1", LOCAL_PORT))
    server.setStopAtShutdown(true)
    val handlers = new HandlerList()
    val roomWebSocketHandler = new RoomWebSocketHandler();
    roomWebSocketHandler.setHandler(new DefaultHandler());
    handlers.setHandlers(Array[Handler](roomWebSocketHandler, new DefaultHandler()))
    server.setHandler(handlers)
    logger.debug("Starting jetty-server")
    jettyServer = Some(server)
    server.start()
    logger.info("Server started on port: " + LOCAL_PORT)
    logger.debug("startServer end")
  }
  def main(args: Array[String]): Unit = {
     startServer()
  }
}

,下面是我的依赖项:

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'ch.qos.logback:logback-classic:1.1.3'
    compile 'com.h2database:h2:1.4.188'
    compile 'org.clapper:grizzled-slf4j_2.11:1.0.2'
    compile 'org.eclipse.jetty:jetty-webapp:9.3.3.v20150827'
    compile 'org.eclipse.jetty:jetty-websocket:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-http:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-io:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-util:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-continuation:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-server:8.1.17.v20150415'
    compile 'org.eclipse.jetty:jetty-jmx:8.1.17.v20150415'
    compile 'commons-cli:commons-cli:1.3.1'
    compile 'org.scala-lang:scala-library:2.11.7'
    runtime 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'org.scalacheck:scalacheck_2.11:1.12.4'
}
错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/io/nio/AsyncConnection
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    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 java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    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.WebSocketHandler.<init>(WebSocketHandler.java:32)
    at mypackage.RoomWebSocketHandler.<init>(RoomStateWebSocketHandler.scala:15)
    at mypackage.Main$.startServer(Main.scala:48)
    at mypackage.Main$.main(Main.scala:109)
    at mypackage.Main.main(Main.scala)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.io.nio.AsyncConnection
    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)
    ... 29 more

我将所有依赖项更新为Jetty 9。

相关内容

  • 没有找到相关文章

最新更新