我建立了一个Websocket服务器,它应该运行一个由websocket servlet工厂创建的servlet。
但是,每当我尝试通过我最喜欢的浏览器访问websocket时,我都会
HTTP ERROR: 500
Problem accessing /test/sound. Reason:
javax.servlet.ServletException: java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory
服务器控制台提供类似的错误。下面是完整的控制台错误消息:
[13:21:26 WARN]: 2015-08-27 13:21:26.912:WARN:/test:qtp20972561-41: unavailable
java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketSe
rverFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.lo
ad(WebSocketServletFactory.java:63)
at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.cr
eate(WebSocketServletFactory.java:42)
at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketSe
rvlet.java:128)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.jav
a:612)
at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java
:468)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:778
)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:587)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1125)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
515)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:1059)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:497)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.jav
a:248)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java
:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:620)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:540)
at java.lang.Thread.run(Unknown Source)
[13:21:26 WARN]: 2015-08-27 13:21:26.913:WARN:oejs.ServletHandler:qtp20972561-41
:
javax.servlet.ServletException: java.lang.ClassNotFoundException: org.eclipse.je
tty.websocket.server.WebSocketServerFactory
at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketSe
rvlet.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.jav
a:612)
at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java
:468)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:778
)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:587)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1125)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
515)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:1059)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:497)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.jav
a:248)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java
:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:620)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:540)
at java.lang.Thread.run(Unknown Source)
Caused by:
java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketSe
rverFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.lo
ad(WebSocketServletFactory.java:63)
at org.eclipse.jetty.websocket.servlet.WebSocketServletFactory$Loader.cr
eate(WebSocketServletFactory.java:42)
at org.eclipse.jetty.websocket.servlet.WebSocketServlet.init(WebSocketSe
rvlet.java:128)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.jav
a:612)
at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java
:468)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:778
)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:587)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1125)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
515)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:1059)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:497)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.jav
a:248)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java
:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:620)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:540)
at java.lang.Thread.run(Unknown Source)
我最好的选择是,由于缺少WebSocketServletFactory类,我忘记了pom.xml中的内容,但我不确定。
以下是我在pom.xml中的存储库和依赖项
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>googlecode</id>
<name>jWebSocket Repository</name>
<url>http://jwebsocket.googlecode.com/svn/repo</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.2.5.v20141112</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.2.5.v20141112</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-server</artifactId>
<version>9.2.5.v20141112</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
如何解决此错误?如果需要更多来源,请提出要求。
答案 0 :(得分:2)
我终于自己回答了我的问题。可以通过将类路径添加到META-INF / manifest.mf文件中缺少的jar来解决该问题。
也许我应该提到我试图通过bukkit插件在Minecraft服务器上运行jetty-server。现在工作正常。显然,这是将外部库添加到bukkit插件的正确方法。
感谢所有接听/评论的人。
答案 1 :(得分:1)
注意:此答案假设您使用的是jetty-distribution和normal webapps(WAR)文件。
您的war文件中
WEB-INF/lib
或者不应该有Jetty类WEB-INF/classes
,因此<scope>provided</scope>
设置。使用jetty-distribution 9.x,请务必在
中设置--module=websocket
${jetty.base}/start.ini
如果您正在编写jetty本地websocket api,请使用此...
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-api</artifactId>
<version>9.3.2.v20150730</version>
<scope>provided</scope>
</dependency>
如果您想要对jetty native websocket api进行servlet支持,请使用此...
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-servlet</artifactId>
<version>9.3.2.v20150730</version>
<scope>provided</scope>
</dependency>
如果您希望客户端支持jetty native websocket api,请使用此...
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>9.3.2.v20150730</version>
<scope>provided</scope>
</dependency>
如果您是针对javax.websocket.server服务器API编写的,请使用以下命令(注意:这包括javax.websocket客户端API)...
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
如果您是针对仅javax.websocket客户端API编写的,请使用以下内容...
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-client-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
以下建议仅适用于嵌入式码头使用WebSocket和
javax.websocket
(JSR-356)支持。
如果您想要javax.websocket.server(又名JSR-356服务器)支持,请使用此...
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>javax-websocket-server-impl</artifactId>
<version>9.3.2.v20150730</version>
<scope>provided</scope>
</dependency>
如果您想要javax.websocket(aja JSR-356客户端)支持使用此...
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>javax-websocket-client-impl</artifactId>
<version>9.3.2.v20150730</version>
<scope>provided</scope>
</dependency>
你的pom中对websocket工件的其他引用是没用的,毫无意义,不能使用em。