1

スタック オーバーフロー ギークの皆様

Java EE 7 を使用して非常に基本的な Java クライアント/サーバー アプリを作成しようとしていますが、JSR 356 実装を使用して websocket 経由でメッセージを送信することを目的としています。

そこで見つけたさまざまなブログに従って、サーバーのプログラミングとデプロイに成功し、Javascript クライアントと Java サーバーと通信することができました。

今私がやろうとしているのは、サーバーと通信して同じ情報を取得する必要があるスタンドアロンの Java アプリを作成することです。JSR 356 実装は Java クライアントで使用できると読みましたが、まさにそれを実行しました。また、Tyrus を使用してクライアントを作成し、ラッチ メカニズムなどを使用してクライアントを実行し続けました。クライアントは最終的にプログラムされ、サーバーは稼働していますが、クライアントを実行しようとすると、次のエラーが発生します。

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
Caused by: java.lang.NoClassDefFoundError: javax/websocket/CloseReason$CloseCode
at Main.Main.main(Main.java:27)
... 6 more
Caused by: java.lang.ClassNotFoundException: javax.websocket.CloseReason$CloseCode
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at org.glassfish.appclient.client.acc.ACCClassLoader.findClass(ACCClassLoader.java:237)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 7 more
Java Result: 1

私は NetBeans 7.3 で Java EE 7 API + Tyrus を使用しており、Glassfish 4 にデプロイしています (これは、私が読んだことから、JSR 356 実装をサポートしています) さて、一体なぜ CloseReason クラスが見つからないのでしょう! :( その場合はコンパイルされるべきではありませんね。

奇妙なことに、websocket の実装 (JSR 356) に関連する他のクラスについて文句を言っていないのに、サーバー (web-app) をデプロイしたところ、websocket メカニズムは問題なく動作しています。(私はそこにCloseReasonを実装していないと思います..しかし、なぜそれについてだけ不平を言っているのですか!:@)

提供されるヘルプは大歓迎です!!

乾杯、

別のスタック オーバーフロー オタクが助けを求めています。:)

4

1 に答える 1

1

そのスタックトレースだけを分析して「答え」を出すことはまったく不可能だと思います。少なくとも、プロジェクトのコード スニペットをいくつか含める必要があります。

さて、私が問題だと思うのはこれです: Tyrus ライブラリは Application Client Container と一緒に配布されていません。ローカルでは、クラスローダーがロードしたい最初のクラス..失敗します。

したがって、プロジェクトを右クリックして [プロパティ] を選択します。ライブラリを選択します。ライブラリが[実行] タブの下に配置されていることを確認します。そうでない場合は、このタブにある [ライブラリを追加... ] ボタンをクリックして、手順に従ってください。

これがお役に立てば幸いです。そうでない場合は、 JavaFX クライアントをパッケージ化し、Java Web Start から起動する方法に関するこのチュートリアルを確認してください。このチュートリアルのアプリケーション クライアントは外部ライブラリにも依存しており、そこに役立つものが見つかるかもしれません。

于 2013-08-22T10:23:03.550 に答える