0

更新これがプロジェクトです。

次のディレクトリ構造があります。

RMI
  |
  api.jar
        |--> org.examples.rmi.api.Pi
        |--> org.examples.rmi.api.Task
        |--> org.examples.rmi.api.Compute
  client.jar
        |--> org.examples.rmi.client.ComputePi
  server.jar
        |--> org.examples.rmi.server.ComputeEngine
        |--> org.examples.rmi.api.Pi
        |--> org.examples.rmi.api.Task
        |--> org.examples.rmi.api.Compute

次のコマンドを入力して、サーバーを起動しました。

C:\Users\Public\RMI\server>set CLASSPATH=
C:\Users\Public\RMI\server>start rmiregistry
C:\Users\Public\RMI\server>java -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/compute.jar" -Djava.rmi.server.hostname=127.0.0.1 -Djava.security.policy=server.policy org.examples.rmi.engine.ComputeEngine

次に、次のコマンドを入力してクライアントを起動しました。

C:\Users\Public\RMI>java -cp api.jar -jar -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/api.jar" -Djava.security.policy=client.policy client.jar 127.0.0.1 45

しかし、次のエラーが表示されます。

Exception in thread "main" java.lang.NoClassDefFoundError: org/examples/rmi/api/Task
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.examples.rmi.api.Task
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 6 more

しかし、api パッケージにある 3 つのクラスを client.jar ファイルに追加すると、クライアントは機能します。

クラスパスを api.jar に設定したにもかかわらず、server.jar ファイル内の同じ 3 つのクラスを削除すると、同じ NoClassDefFoundError が発生します。

C:\Users\Public\RMI>java -cp api.jar -jar -Djava.rmi.server.hostname=127.0.0.1 -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/api.jar" -Djava.security.policy=server.policy server.jar

3 つのクラスを api パッケージに複数の場所に配置したくありません。それらを api.jar ファイル内の 1 か所に保持したいだけです。コマンドラインでクラスパスを正しく設定していませんか?

アドバイスをいただければ幸いです。ありがとう!

4

1 に答える 1

2

-jar オプションを使用すると、-cp 引数は無視されます。client.jar のマニフェストで Class-Path オプションを使用して、client.jar を api.jar に接続する必要があります。

于 2012-07-01T00:26:00.873 に答える