RemoteException java.rmi.UnmarshalException:错误解组返回

时间:2011-09-08 22:48:50

标签: java jvm rmi

我正在差异物理机上的2个JVM上运行程序here。我收到了错误

RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manager: RMI class loader disabled)

我甚至尝试在同一台机器上运行它(未更改的程序)并且它可以工作,但它在diff机器上不起作用。有人可以帮助我吗?

@ beny23-谢谢,但我仍然得到这个错误:

RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: CalculatorImpl_Stub

客户端如何拥有CalculatorImpl_stub的副本?

5 个答案:

答案 0 :(得分:12)

我遇到了这个问题,因为我在客户端和服务器代码中有不同的包名:

package my.pkg; 
// server side interface definition...

// ------------- //

package my.pkg.something;
// client side interface definition...

我更改了客户端软件包的名称,并将其设置为服务器端软件包的名称:

package my.pkg; 
// server side interface definition...

// ------------- //

package my.pkg; // renamed to the name of package in server-side .
// client side interface definition...

问题消失了。

答案 1 :(得分:9)

我的Java类有RMI ClientServer。我决定将它们放在自己的包中,而不是作为默认包运行。

将它们放入自己的包中后,在连接时发生java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException:错误。

我把程序放回到默认包中,它们都重新开始工作了。

我意识到这可能是技术上的原因,但这对我有用!

答案 2 :(得分:7)

听起来你没有使用安全管理器:

您是否有政策文件(my.policy):

grant {
  permission java.security.AllPermission;
};

并使用

运行您的程序
java -Djava.security.manager -Djava.security.policy=/some/path/my.policy MyClass

答案 3 :(得分:2)

有三种情况。

  1. 如果在绑定到注册表时遇到错误,则注册表无法在其类路径或代码库功能上访问该类。

  2. 如果在查找注册表时遇到错误,则客户端无法在其类路径上或通过代码库功能访问该类。

  3. 如果您正在使用代码库功能,那么反过来可能是由于注册表在其类路径上具有访问该类的权限,这导致它不使用代码库,这会导致丢失了代码库注释,因此您的客户端不知道如何使用该类的代码库。

  4. 如果您没有使用代码库功能,请忽略上一段; - )

答案 4 :(得分:0)

我用重命名包名解决了它。服务器和客户端在两个不同的项目中,而是使用相同的包命名。