私はプログラムを実行しています ここ 異なる物理マシン上の2つのJVMで。エラーが発生します
RemoteException
Java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
Java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manager: RMI class loader disabled)
同じマシン(変更されていないプログラム)で実行してみましたが、diffマシンでは動作しません。誰かplsは私を助けることができますか?
@ beny23-ありがとう、しかし私はまだこのエラーで終わります:
RemoteException
Java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
Java.lang.ClassNotFoundException: CalculatorImpl_Stub
クライアント側はどのようにしてCalculatorImpl_stubのコピーを持つことができますか?
セキュリティマネージャを使用していないようです。
ポリシーファイルを入手しましたか(my.policy
):
grant {
permission Java.security.AllPermission;
};
を使用してプログラムを実行します
Java -Djava.security.manager -Djava.security.policy=/some/path/my.policy MyClass
クライアントコードとサーバーコードでパッケージ名が異なるため、この問題が発生しました。
package my.pkg;
// server side interface definition...
// ------------- //
package my.pkg.something;
// client side interface definition...
クライアント側パッケージの名前を変更し、サーバー側パッケージの名前として設定しました。
package my.pkg;
// server side interface definition...
// ------------- //
package my.pkg; // renamed to the name of package in server-side .
// client side interface definition...
そして問題はなくなりました。
私は働いていましたRMI Client
およびServer
for my Java class。これらをデフォルトのパッケージとして実行するのではなく、独自のパッケージに配置することにしました。
それらを独自のパッケージに配置した後、Java.rmi.UnmarshalException: error unmarshalling return; nested exception is: Java.lang.ClassNotFoundException:
接続時にエラーが発生し始めました。
プログラムをデフォルトのパッケージに戻すと、すべてが再び機能し始めました。
これにはおそらく技術的な理由があると思いますが、これは私にとってはうまくいきました!
3つのケースがあります。
レジストリへのバインド時にエラーが発生した場合、レジストリはクラスパス上またはコードベース機能を介してそのクラスにアクセスできません。
レジストリの検索時にエラーが発生した場合、clientは、クラスパス上またはコードベース機能を介してそのクラスにアクセスできません。
コードベース機能を使用している場合、それはレジストリによって引き起こされる可能性がありますhavingクラスパス上のそのクラスへのアクセスにより、コードベースが使用されなくなり、コードベースアノテーションが失われます。そのため、クライアントはそのクラスのコードベースを使用することを知りません。
コードベース機能を使用していない場合は、前の段落を無視してください;-)
パッケージ名の名前を変更して解決しました。サーバーとクライアントは2つの異なるプロジェクトにありますが、パッケージの名前は同じです。