Java RMI:服务器和客户端在同一个文件夹中运行良好,在同一台PC的不同文件夹中不能正常工作?

时间:2013-02-28 09:27:36

标签: java rmi

我是RMI的新手

我试过这个example。这可以按预期工作。

Calculator.class
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class
+
CalculatorClient.class

实际上我打算在两台不同的PC上进行测试。但不是那样,我开始在两个不同文件夹中的同一台PC上尝试它。

一个文件夹包含服务器:
Calculator.class :interface
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class

另一个文件夹包含客户端:
Calculator.class :这只是上面服务器的Calculator接口的副本
CalculatorClient.class

当我尝试运行时 服务器运行良好

现在,当我运行客户端时,打印出错误:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manag
er: RMI class loader disabled)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Unknown Source)
        at CalculatorClient.main(CalculatorClient.java:12)
Caused by: java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security ma
nager: RMI class loader disabled)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
        at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        ... 3 more
  • 它们在同一个文件夹中运行良好。
  • 当他们在两个不同的文件夹中时出现
  • 错误。

为什么?
如何解决此错误?

3 个答案:

答案 0 :(得分:1)

在客户端CLASSPATH中,异常中指定的类不可用。所以修复它。必须将远程存根和接口及其所依赖的所有内容分发给客户端。

答案 1 :(得分:1)

您的主要问题是遵循非常过时的RMI示例。这里有一个提示,如果RMI示例包含rmic(或存根和骨架)的使用,请不要使用它。我建议从sun/oracle tutorial开始。

答案 2 :(得分:0)

此问题的最常见原因是调用UnicastRemoteObjectexportObject(Remote obj)。从文档中您将看到它返回RemoteStub的实例,以便存根类必须可用,这只有在您使用rmic生成时才可用。

请改用UnicastRemoteObject.exportObject(Remote obj, int port)。它返回一个接口(Remote),并且在没有最近发布的生成类的情况下工作。