我在嵌入式jetty网络服务器中使用websockets时遇到了一些麻烦。使用以下设置:
- Embedded Jetty版本9.3
- 五个不同的战争,每个战争都加载到webappcontext中,并为Annotations等添加了配置。 ParentLoaderPriority设置为true
- 其中一个战争包含一个websocket,使用websocketlistener接口(native jetty websocket)实现。通过注册websocket的WebSocketServlet连接。
- 相同的war包含一个简单的html页面,其中包含一个通过调用servlet连接到websocket的javascript。
依赖性,战争的pom包含jetty.websocket。 servlet 依赖项,嵌入式服务器的pom包含jetty.websocket。 server 依赖项。没有其他任何明智的方法。
当我运行它时,html中的websocket调用给出了错误。日志记录显示jetty.websocket.server.WebSocketServerFactory的NoClassDefFoundException。显然,类加载会出现问题,但我无法确定如何修复它。
这是我迄今为止尝试过的(无济于事):
- 将websocket作为Servlet添加到嵌入式jetty(因此不在webappcontext中,而是在servletContextHandler中) - >工作正常
- 将classloaderpriority设置为false。
- 检查系统和服务器类,并根据jetty文档手动设置它们。 " org.eclipse.jetty.websocket&#34。注册为系统类。
- 添加jetty.websocket.server(和jetty.websocket.api)作为WAR的依赖项(除服务器外)。这会产生不同的错误,因为父类和war类加载器之间存在冲突。将服务器依赖性的范围设置为将错误还原为上述ClassDefNotFound异常。
- 将jetty.websocket.server位置添加到战争的类路径中。
我没有想法。关于还有什么可以尝试的任何建议都非常感谢!
编辑:找到它
问题不在于jetty配置,而是在用于启动嵌入式服务器的服务包装器中。我错误地配置了这个包装器,因此在运行服务器时,websocket依赖项不在类路径上。修复包装导致websockets正常工作。不需要更改jetty配置。