組み込みモードでjetty 8.1.12を実行する自己実行戦争内でCometd Websocketサーバーを実行しようとしています。この方法で他のすべての 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)
私は他のすべての投稿を読みましたが、これは違うと思います。
私は 2 つの Maven プロジェクトを持っています。1 つは、maven-shades プラグインを使用して jetty-server 8.1.12 を含む uber jar を構築し、もう 1 つはその最初の jar を戦争オーバーレイとして含むものです。オーバーレイはすべての jetty-server クラスを war のルートに置くので、"java -jar my.war" で実行できます。Cometd も websocket 用の jetty を必要とするため、WEB-INF/lib ディレクトリ内のすべての依存関係と jar もすべて 8.1.12 であることを再確認しました。そのため、サーバーは 1 つだけで、その桟橋は全体で 8.1.12 です。他のすべての投稿/質問は、非 Jetty または非 Websocket コンテナーまたは非 HTTP 接続が原因ですが、これは 100% jetty 8.1.12 であり、スタンドアロンの外部 jetty 8.1.12 インスタンスで展開すると、webapp は正常に動作します。
maven-shades からの uberjar の依存関係 (埋め込まれた桟橋の自己実行戦争用)
[INFO] com.pgi.pulsar:pulsar-container:jar:1.0-SNAPSHOT
[INFO] +- org.eclipse.jetty:jetty-server:jar:8.1.12.v20130726:compile
[INFO] | +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] | +- org.eclipse.jetty:jetty-continuation:jar:8.1.12.v20130726:compile
[INFO] | \- org.eclipse.jetty:jetty-http:jar:8.1.12.v20130726:compile
[INFO] | \- org.eclipse.jetty:jetty-io:jar:8.1.12.v20130726:compile
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:8.1.12.v20130726:compile
[INFO] | \- org.eclipse.jetty:jetty-security:jar:8.1.12.v20130726:compile
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:8.1.12.v20130726:compile
[INFO] | \- org.eclipse.jetty:jetty-xml:jar:8.1.12.v20130726:compile
[INFO] +- org.eclipse.jetty:jetty-servlets:jar:8.1.12.v20130726:compile
[INFO] | +- org.eclipse.jetty:jetty-client:jar:8.1.12.v20130726:compile
[INFO] | \- org.eclipse.jetty:jetty-util:jar:8.1.12.v20130726:compile
[INFO] \- junit:junit:jar:4.8.2:test
埋め込まれた桟橋を実行するコードは次のとおりです。
public class Main {
public static void main(String[] args) throws Exception {
Server server = new Server();
SocketConnector connector = new SocketConnector();
connector.setMaxIdleTime(1000 * 60 * 60);
connector.setSoLingerTime(-1);
String portValue = System.getProperty("pulsar.port");
int port = (portValue != null ? Integer.parseInt(portValue) : 8080);
connector.setPort(port);
server.setConnectors(new Connector[]{connector});
WebAppContext context = new WebAppContext();
context.setServer(server);
context.setContextPath("/");
ProtectionDomain protectionDomain = Main.class.getProtectionDomain();
URL location = protectionDomain.getCodeSource().getLocation();
context.setWar(location.toExternalForm());
server.setHandler(context);
server.start();
System.in.read();
server.stop();
server.join();
webapp WEB-INF/libs のライブラリ:
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
この問題は、webapp とそれを囲む jetty サーバーの間で共有される HttpConnection (HttpConnection-ThreadLocal と osgi に関する投稿を読んだ) などの jetty クラス間のクラスローディングの問題に関連しているように感じます。これらのクラスは実際には両方の場所にありますが、両方の場所で必要になるため、それらを分離する方法が見つかりません。
おそらく、クラスロードされたクラスを webapp クラスローダと共有する jetty を持つ方法はありますか? この時点で、アイデアが尽きたので、次に何を試せるかわかりません。これを機能させるにはどうすればよいですか?