远程异常java.rmi.UnmarshalException:解组返回时出错

13

我在两台不同物理机器上的2个JVM上运行程序这里。 我遇到了以下错误:

RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manager: RMI class loader disabled)
我甚至尝试在同一台机器上运行它(未更改的程序),它可以正常工作,但在不同的机器上却无法工作。请问有人能帮我解决问题吗?
@beny23- 感谢您的回复,但我仍然遇到了这个错误:
RemoteException
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: CalculatorImpl_Stub

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

5个回答

16

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

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...

问题随之消失。


这个答案解决了我的问题。你有任何想法,为什么会发生这种情况吗? - Rodrigo Borba
@RodrigoBorba 不好意思,我记不起来了... - Amin Saqi
帮助我在ehCache中实现RMI缓存复制。 - Mahesh

9
我曾经为我的Java课程编写了一个可工作的RMI客户端和服务器。后来我决定将它们放到自己的包中,而不是运行在默认包中。
当我把它们放到自己的包中后,连接时开始出现“java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException:”错误。
我把程序放回默认包中,它就又开始工作了。
我意识到这可能有技术上的原因,但对我来说这样做是有效的!

1
太棒了,它对我起作用了。 - slhddn
1
是的!它对我也起作用了。 - edisonthk

7
似乎您没有使用安全管理器:
您是否有策略文件(my.policy):
grant {
  permission java.security.AllPermission;
};

并且使用以下方法运行您的程序

java -Djava.security.manager -Djava.security.policy=/some/path/my.policy MyClass

1
他不需要SecurityManager.policy文件来解决这个问题,除非他正在尝试使用RMI代码库功能,而这并没有被说明。 - user207421
EJP请添加更多信息!听起来非常有用,但我不明白。 - Victor
@Victor,请看我的回答。 - user207421

3
有三种情况。
1.如果在绑定到Registry时出现错误,则Registry在其类路径上或通过codebase功能无法访问该类。
2.如果在查找Registry时出现错误,则你的客户端在其类路径上或通过codebase功能无法访问该类。
3.如果使用了codebase功能,那么可能是Registry在其类路径上具有访问该类的权限,这会导致它不使用codebase,从而导致丢失codebase注释,因此你的客户端不知道要为该类使用codebase。
4.如果没有使用codebase功能,请忽略前面的段落;)

1
刚刚着陆在这里...你能否详细解释一下你所谈论的代码库功能? - gravetii

1

我通过重命名包名称解决了这个问题。服务器和客户端位于两个不同的项目中,但是使用相同的包命名。


这对我起作用了。 - IdkWhy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接