2015-12-08 9 views
5

はクラスパス上にあり、あらゆることなく、アプリケーションの他の多くの場所で使用されています問題。javax.json.JsonValueのためのJava RMIのNoClassDefFoundError

リモートオブジェクトにJsonValueを返したメソッドを追加するまで、アプリケーションのこの部分は正常に機能しました。

アイデア?

java.rmi.ServerError: Error occurred in server thread; nested exception is: 
    java.lang.NoClassDefFoundError: javax/json/JsonValue 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:416) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378) 
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 

注: は、私はまた、コードベースでのrmiregistryを実行しようとしたjavax.json.jarで直接指摘したが、例外が例外に実行

rmiregistry -J-Djava.rmi.server.codebase=file:///JarLibrary/javax.json.jar & 
+0

リモートインターフェイスに追加したメソッドのシグネチャを表示できますか? – QuakeCore

+0

@QuakeCore:public static JsonValue getJsonValue() – jb1

答えて

3

ままUnicastRemoteObject.exportObject().

に通話中に生じました

あなたはいません。スタックトレースを参照してください。あなたがjava.rmi.server.codebaseプロパティセットでサーバーを実行する必要がRegistry.bind().

で起こっているが、ファイル://コードベースURLはここで、すべてのクライアントのいずれかがサーバホストで実行されていない限り仕事に行くのではありませんコードベース機能がまったく必要ない場合や、レジストリとクライアントの両方が使用できる形式の共有フォルダを指している場合です。通常はHTTPです。

しかし、コードベース機能が必要かどうかは疑問です。関連するjarファイルがレジストリとクライアントの両方のCLASSPATH上にあることを確認するだけです。レジストリのための最も簡単な方法は、rmiregistryプログラムの代わりにサーバーJVMでLocateRegistry.createRegistry()を使用することです。

なぜJSONを使用しているのだろうと思います。 RMIはオブジェクト直列化を基に構築されています。別のシリアライザを追加する必要はありません。

+0

フィードバックありがとうございます。 Registry.bind()は、コードがUnicastRemoteObject.exportObject()を呼び出す結果として呼び出されています。私のレジストリとサーバは同じマシン上で動作しており、クライアントはネットワーク上に分散しています。 UnicastRemoteObject.exportObject()を呼び出す前にLocateRegistry.createRegistry()を呼び出すと、外部からrmiregistryを実行する必要はないと言っていますか?私はそれを試してみましょう。また、JSONを使用してNode.jsサーバーのネットワークと通信しています。 – jb1

+0

LocateRegistry.createRegistry()がトリックをしました!ありがとうございました。 – jb1

+0

UnicastRemoteObject.exportObject() '(a)は' Registry.bind() 'を呼び出さず、(b)はスタックトレースには現れません。 UnicastRemoteObject.exportObject() ''中の* Ergo *'が正しくありません。 – EJP