4

組み込みモードで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 を持つ方法はありますか? この時点で、アイデアが尽きたので、次に何を試せるかわかりません。これを機能させるにはどうすればよいですか?

4

3 に答える 3

0

私は同じ問題を抱えていました.私が構築しようとしてatmosphereいるアプリケーションはJetty-9.

Jetty jar は次の場所で見つかりましたwar/WEB-INF/lib

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、問題はなくなりました。

于 2014-07-27T04:17:32.967 に答える
0

vaadin 7と大気でTomcatを使用しているときに、このエラーが発生しました。このエラーは、アプリケーションの正常な動作には影響しませんでしたが、ときどきポップアップしていました。

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

クラスパスから gwt-dev-2.7.0.vaadin4.jar を削除して問題を解決しました。どうやら要らなかったようです。

于 2018-06-27T09:47:35.870 に答える