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でテストしました:
空のクラスパスを使用して rmiregistry をセットアップします (および cd で java/bin ディレクトリに移動します)。
set CLASSPATH=""; export CLASSPATH start rmiregistry
以前と同じコマンドでサーバーを起動します (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 を使用していますが、影響はありますか?