如何在嵌入式Jetty 8.1.12上的WebSocketFactory.upgrade()期间修复NPE

如何在嵌入式Jetty 8.1.12上的WebSocketFactory.upgrade()期间修复NPE,websocket,jetty,embedded-jetty,cometd,Websocket,Jetty,Embedded Jetty,Cometd,我试图在一个自动执行的war中运行Cometd websocket服务器,该war以嵌入式模式运行jetty 8.1.12。我能够以这种方式运行所有其他web应用程序,但对于websocket案例,我得到以下错误: java.lang.NullPointerException at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:238) at org.eclipse.jetty.websock

我试图在一个自动执行的war中运行Cometd websocket服务器,该war以嵌入式模式运行jetty 8.1.12。我能够以这种方式运行所有其他web应用程序,但对于websocket案例,我得到以下错误:

java.lang.NullPointerException
at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:238)
at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:396)
at org.cometd.websocket.server.WebSocketTransport.handle(WebSocketTransport.java:157)
at org.cometd.server.CometdServlet.service(CometdServlet.java:166)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
我已经阅读了所有其他的帖子,我认为这是不同的

我有两个maven项目,一个使用maven shades插件构建包含jetty server 8.1.12的uber jar,另一个包含第一个jar作为war覆盖。覆盖层将所有jetty服务器类放在war的根目录中,因此可以使用“java-jar my.war”运行它。因为Cometd也需要jetty用于WebSocket,所以我加倍确保WEB-INF/lib目录中的所有依赖项和jar也都是8.1.12。因此,只有一台服务器及其jetty 8.1.12。所有其他帖子/问题都是因为非jetty或非websocket容器或非http connect,但这是100%jetty 8.1.12,当使用独立的外部jetty 8.1.12实例部署时,webapp工作正常

maven shades的uberjar依赖项(用于嵌入式jetty self-exe war)

以下是运行嵌入式jetty的代码:

公共类主{
公共静态void main(字符串[]args)引发异常{
服务器=新服务器();
插座连接器=新插座连接器();
connector.setMaxIdleTime(1000*60*60);
连接器。设定冷却时间(-1);
字符串portValue=System.getProperty(“pulsar.port”);
int port=(portValue!=null?Integer.parseInt(portValue):8080);
连接器。设置端口(端口);
setConnectors(新连接器[]{Connector});
WebAppContext=新的WebAppContext();
context.setServer(服务器);
context.setContextPath(“/”);
ProtectionDomain ProtectionDomain=Main.class.getProtectionDomain();
URL location=protectionDomain.getCodeSource().getLocation();
setWar(location.toExternalForm());
setHandler(上下文);
server.start();
System.in.read();
server.stop();
join();
webapp WEB-INF/libs中的LIB:

 jar tvf target/pulsar-websockets-1.0-SNAPSHOT.war | grep WEB-INF/lib/jetty | cut -b 36-100
 WEB-INF/lib/jetty-client-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-continuation-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-http-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-io-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-jmx-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-server-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-util-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-websocket-8.1.12.v20130726.jar
 WEB-INF/lib/jetty-xml-8.1.12.v20130726.jar
这个问题似乎与jetty类之间的类加载问题有关,比如HttpConnection(我读了一篇关于HttpConnection ThreadLocal和osgi的帖子)这些类实际上在这两个地方都有,但我找不到一种方法将它们分开,因为这两个地方都需要它们


也许有一种方法可以让jetty与webapp类加载器共享其类加载的类?目前,我已经没有主意了,不知道下一步可以尝试什么。我该怎么做才能让它正常工作?

让它正常工作。在比较了外部jetty服务器和嵌入式配置之间的确切差异后,我这需要一点尝试和错误,它并不明显,所以我将分享我为他人所做的一切

首先,我在WEB-INF/lib中需要的唯一jetty jar是:

jetty-util-8.1.12.v20130726.jar
嵌入容器外部的所有其他容器。即使服务器类路径中存在此jar,应用程序也不会加载。唯一可行的方法是,如果我只将该jar添加到/lib目录中。这导致了下一个错误:

java.lang.IllegalStateException: Websockets not supported on blocking connectors
  at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:237)
  at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:396)
  at org.cometd.websocket.server.WebSocketTransport.handle(WebSocketTransport.java:157)
请注意,它经过了NPE,这是一个进程。因此,通过查看另一个正在工作的jetty服务器中的日志行,以及对非阻塞连接器的一些阅读,我使用了这个连接器,而不是SocketConctor:

import org.eclipse.jetty.server.nio.SelectChannelConnector;
. . .
SelectChannelConnector connector = new SelectChannelConnector();

这两个非常简单的更改让我启动并运行了。

我也遇到了同样的问题,我试图构建的应用程序依赖于
atmosphere
,我在
Jetty-9
下运行应用程序

我在
war/WEB-INF/lib
中找到了Jetty jar:

jetty-continuation-7.6.7.v20120910.jar
jetty-http-7.6.7.v20120910.jar
jetty-io-7.6.7.v20120910.jar
jetty-security-7.6.7.v20120910.jar
jetty-server-7.6.7.v20120910.jar
jetty-servlet-7.6.7.v20120910.jar
jetty-util-7.6.7.v20120910.jar
jetty-websocket-7.6.7.v20120910.jar


我切换到Jetty-8,问题消失了。

我在使用tomcat与vaadin 7和atmosphere时遇到了这个错误。这个错误对应用程序的良好行为没有影响,但时不时会出现

java.lang.NullPointerException
at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:238)

通过从我的类路径中删除gwt-dev-2.7.0.vaadin4.jar解决了这个问题。看来我根本不需要它。

另外请注意,如果您在使用1个webapp的嵌入式jetty上做任何事情,只需使用
WebAppContext.setParentLoaderPriority(true)
并实际删除您的
WEB-INF/lib
目录。这是一个很好的建议,我先尝试了一下。但是,除了addSystemClasses()这里描述的等等并没有解决这个问题。我每次都会遇到NoClassDefFound和ClassNotFound异常。websocket的特性以及它如何跨越cometd webapp和jetty容器,出于某种原因,使得这一点很棘手。
java.lang.NullPointerException
at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:238)