Java 嵌入式码头中的Websocket类装载

Java 嵌入式码头中的Websocket类装载,java,maven,embedded-jetty,java-websocket,Java,Maven,Embedded Jetty,Java Websocket,我在嵌入式jetty Web服务器中使用WebSocket时遇到一些问题。使用以下设置: 嵌入式Jetty 9.3版 五个不同的WAR,每个都加载在webappcontext中,并添加了注释等配置。ParentLoaderPriority设置为true 其中一个WAR包含一个websocket,使用websocketlistener接口(本机jetty websocket)实现。通过注册websocket的WebSocketServlet连接 同一个war包含一个简单的html页面,其中包含一

我在嵌入式jetty Web服务器中使用WebSocket时遇到一些问题。使用以下设置:

  • 嵌入式Jetty 9.3版
  • 五个不同的WAR,每个都加载在webappcontext中,并添加了注释等配置。ParentLoaderPriority设置为true
  • 其中一个WAR包含一个websocket,使用websocketlistener接口(本机jetty websocket)实现。通过注册websocket的WebSocketServlet连接
  • 同一个war包含一个简单的html页面,其中包含一个javascript,该javascript通过调用servlet连接到websocket
就依赖关系而言,war的pom包含jetty.websocket.servlet依赖关系,嵌入式服务器的pom包含jetty.websocket.server依赖关系。没有什么比websocket更明智的了

当我运行它时,html中的websocket调用会给出一个错误。日志显示jetty.websocket.server.WebSocketServerFactory的NoClassDefFoundException。显然,类加载出现了问题,但我无法确定如何修复它

以下是到目前为止我尝试过的(没有用的):

  • 将websocket作为Servlet添加到嵌入式jetty(因此不是在webappcontext中,而是在servletContextHandler中)->效果很好
  • 将classloaderpriority设置为false
  • 检查系统和服务器类,并根据jetty文档手动设置它们。“org.eclipse.jetty.websocket.”注册为系统类
  • 添加jetty.websocket.server(和jetty.websocket.api)作为WAR的依赖项(除了服务器)。这给出了一个不同的错误,因为父类和war类加载器之间存在冲突。将作用域设置为“为服务器依赖项提供”会将错误还原为前面提到的ClassDefNotFound异常
  • 将jetty.websocket.server位置添加到war的类路径
我没有主意了。任何关于尝试其他方法的建议都将不胜感激

编辑:找到它


问题不在jetty配置中,而是在用于启动嵌入式服务器的服务包装中。我错误地配置了这个包装器,因此运行服务器时websocket依赖项不在类路径上。固定包装使WebSocket正常工作。不需要更改jetty配置。

您是否要保留原始的JAR?或者对类进行任何类型的uber jar/着色/合并?不,所有服务器依赖项,包括嵌入式服务器jar都在lib目录中组装。所有war文件都集中在wars目录中,并解压缩到temp目录。您是否使用任何类型的替代类加载,例如OSGi、JPMS/Jigsaw?啊,对不起,我可能浪费了您的时间。正如您可能怀疑的那样,它与Jetty配置无关。问题出在应用程序的服务包装器中,我在类路径的配置中出错。因此,当作为服务运行时,服务器jar的类路径上不存在websocket依赖项。谢谢你的时间,你是不是把原来的罐子一个人留下?或者对类进行任何类型的uber jar/着色/合并?不,所有服务器依赖项,包括嵌入式服务器jar都在lib目录中组装。所有war文件都集中在wars目录中,并解压缩到temp目录。您是否使用任何类型的替代类加载,例如OSGi、JPMS/Jigsaw?啊,对不起,我可能浪费了您的时间。正如您可能怀疑的那样,它与Jetty配置无关。问题出在应用程序的服务包装器中,我在类路径的配置中出错。因此,当作为服务运行时,服务器jar的类路径上不存在websocket依赖项。谢谢你的时间