0

コマンドラインからRMIレジストリを作成している場合、クライアントはオブジェクトをレジストリにバインドすることに問題はありません。

ただし、を使用して RMI レジストリを開始するProcessBuilderと、エラーが発生します。

rmiregistryこれは、使用して作成するための私のコードですProcessBuilder

ProcessBuilder obj = new ProcessBuilder ("rmiregistry","2500");

Process obj_process = obj.start();

ProcessBuilder自分の RMI レジストリにバインドしようとしているときに使用するために発生するエラー

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: node_func

node_funcインターフェイスです

何か案は?

4

2 に答える 2

1

LocateRegistry.createRegistry() を使用できるのに、別のプロセスを開始する理由がわかりません。そうすれば、この問題もなくなります。

于 2012-09-11T07:42:59.570 に答える
0

rmir​​egistry アプリケーションがどこからクラスをロードするかを認識していないため、例外が発生しています。RMI レジストリでオブジェクトをバインドしようとすると、レジストリはそのオブジェクトのクラス定義をダウンロードします。

この問題を処理する正しい方法は、java.rmi.server.codebase プロパティを設定することです。

(プロジェクトを右クリック->実行->実行構成->引数-> VM引数)。

このプロパティでは、次のようにディレクトリ パスをスラッシュで終了する必要があります。

-Djava.rmi.server.codebase=file:${workspace_location}/folder/

${workspace_location} 変数が相対パスであり、rmiregistry アプリケーションが同じディレクトリで開始されていないため、相対パスが正しくない場合にも問題が発生する可能性があります。パスを絶対パスにするか、適切なディレクトリで rmiregistry を開始すると、ClassNotFoundException は発生しなくなります。もう少し詳しい情報については、 java.rmi.server.codebaseプロパティのチュートリアルを参照してください。

それが役に立てば幸い。

この男のクレジット

于 2012-09-10T21:34:36.770 に答える