0

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 ファイルに含まれています。

4

1 に答える 1

1

この問題は、rmiregister を実行し、コードベースが配置されている CLASSPATH を設定すると解決されました。

export CLASSPATH=SOMEWHERE_THE_LOCAL_BASE_IS_LOCATED
rmiregistry 
于 2013-11-07T18:02:13.213 に答える