RMI アプリケーションのプロジェクトがあります。Eclipseで( RMIプラグインを使用して)正常にテストできたとき、Eclipseのエクスポート機能を使用してjarファイルとしてエクスポートしようとしました。
問題は、エクスポートされた jar ファイルで正常に動作するアプリケーションが 1 つだけであることです。
java -jar registry.jar
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: common.Registry <-- ???
エラー メッセージは、クラスが見つからないことを示しています。jar ファイルを解凍して、クラスが jar ファイルに適切にエクスポートされていることを確認します。
temp> unzip registry.jar
Archive: registry.jar
inflating: META-INF/MANIFEST.MF
creating: client/
inflating: client/ChatClientImpl.class
creating: common/
inflating: common/ChatRoomProvider.class
inflating: common/Entity.class
inflating: common/ChatRoomServer.class
inflating: common/ChatClient.class
inflating: common/Registry.class <<<---
そして、これは rmiregistry からキャッチされたメッセージです:
Exception dispatching call to [0:0:0, 0] in thread
"RMI TCP Connection(2)-146.6.53.181" at Sun Nov 03 20:33:25 CST 2013:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: common.Registry
エラーが発生するコードは次のとおりです。
try {
// clients and providers can access with the name Registry
Naming.rebind("Registry", new RegistryImpl()); <--
} catch (Exception e) {
e.printStackTrace();
}
何が問題なのですか?jar ファイルがその jar ファイル内にクラス ファイルを見つけられないのはなぜですか?
追加した
一時的な解決策は次のとおりです。
java -Djava.rmi.server.codebase=file:/WHERE_THE_BIN_IS/bin/ -jar registry.jar
コードベース ディレクトリを明示的に指定することもできますが、同じコードが既に jar ファイルに含まれています。