1

3 つの JAR を使用して RMI プログラムをコーディングしています。

  • RMIServer、サーバー側のクラスが含まれています
  • RMIClient にはクライアント側のクラスが含まれています
  • RMIResource にはサーバーとクライアントの共有コンテンツ (インターフェース、カスタム例外) が含まれます

個別の JAR ファイルを作成するために、NetBeans で 3 つのプロジェクトを作成し、他の 2 つのプロジェクトの「Libraries/Build」セクションで共有 Jar を宣言しました。

すべてがうまく構築され、エラーはありません。

しかし、コマンドラインからサーバーを起動しようとすると、共有ファイルを個別の JAR に入れる前は簡単でしたが、これは突然苦痛です...

以下に、私が試したコマンドの例をいくつか示します。

  • サーバー リソースを指す ClassPath を維持するが、デュアル CodeBase を使用する

    java -cp ~/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
    

結果:

Network exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: rmiresource.BookingManager
...
  • デュアル ClassPath を使用しているが、CodeBase はサーバー リソースを指している

    java -cp "~/NetBeansProjects/RMIServer/dist/RMIServer.jar;~/NetBeansProjects/RMIServer/dist/lib/RMIResource.jar" -Djava.rmi.server.codebase=file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar rmiserver.Shop
    

結果:

Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
  • デュアル ClassPath とデュアル CodeBase の使用

    java -cp "~/NetBeansProjects/RMIServer/dist/RMIServer.jar;~/NetBeansProjects/RMIServer/dist/lib/RMIResource.jar" -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
    

結果:

Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...

編集: 私はローカル コンピューターで作業しており、遠隔接続をシミュレートしています。したがって、「http」ではなく「file」プロトコルを使用します。

何か不足していますか?ご協力いただきありがとうございます


最初のソリューションが最も有望だったので、もう一度テストしました。

    java -cp ~/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop

それでも失敗しました。

次に、Windowsでテストしました:

  1. 空のクラスパスを使用して rmiregistry をセットアップします (および cd で java/bin ディレクトリに移動します)。

    set CLASSPATH=""; export CLASSPATH
    start rmiregistry
    
  2. 以前と同じコマンドでサーバーを起動します (Win 環境が変更された場合)。

    java -cp c:/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/c:/netbeansprojects/rmiserver/dist/rmiserver.jar file:/c:/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
    

そして...うまくいきました!

Linux と Windows の両方でソリューションをクリーンアップ/再構築しましたが、まだ Linux と Windows で動作していません...両方で同じ Netbeans バージョンを使用しています!

誰かが私にそれを説明できますか?Linux で JDK 6 と Windows で JDK 7 を使用していますが、影響はありますか?

4

1 に答える 1

0

ファイル:コードベースはローカルマシンからは機能しません。HTTPを使用する必要があります。ファイルを使用することもできます。URLがクライアントで意味をなすように共有ディレクトリを指すURLですが、これはLANの外部では機能しません。

コードベース機能を使用している場合を除き、RMIレジストリはクラスパスを介して共有クラスにアクセスする必要があります。rmiregistry-J-Dclasspath = ... LocateRegistry.createRegistry()を使用する方が簡単で、リモートオブジェクトと同じJVMにあります。もちろん、同じクラスパスを使用します。

于 2011-09-02T08:15:29.630 に答える