Java RMI and NoClassDefFoundError



>更新:这是项目。

我有以下目录结构:

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:UsersPublicRMIserver>set CLASSPATH=
C:UsersPublicRMIserver>start rmiregistry
C:UsersPublicRMIserver>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:UsersPublicRMI>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 包中的三个类添加到客户端.jar文件中,则客户端可以工作。

如果我删除服务器文件中相同的三个类,即使我将类路径设置为 api.jar,我也会得到相同的 NoClassDefFoundError.jar。

C:UsersPublicRMI>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

我不想将 api 包中的三个类放在多个地方。我只想将它们保存在一个地方,在 api.jar 文件中。我没有在命令行上正确设置类路径吗?

您的建议将不胜感激。谢谢!

使用 -

jar 选项时,将忽略 -cp 参数。您应该使用客户端清单中的类路径选项.jar将客户端.jar连接到 api.jar。

最新更新