从服务器下载Stub类到客户端的问题 - Java RMI

时间:2011-07-09 02:42:28

标签: java exception permissions client rmi

我在运行HelloWorld Java RMI应用程序时遇到问题。 我在一台计算机上有服务器,远程类和远程接口,在另一台计算机上有一个客户端和一个远程接口。服务器和注册表运行正常。当我尝试运行客户端时,我收到此错误:

Client1异常:java.rmi.UnmarshalException:错误解组返回;嵌套异常是:         java.lang.ClassNotFoundException:Remote_Stub(没有安全管理器:禁用RMI类加载器)

我注意到如果我将Remote_Stub.class文件放在与客户端相同的目录中,一切正常。所以我认为我的问题是将存根从服务器下载到客户端。

我不太确定为什么这会给我这个错误,但在做了一些研究之后我觉得它与安全性有关,因为我没有权限将文件从一台计算机下载到另一台计算机(因为它说“没有安全经理”)如果是这样,有谁知道如何解决这个问题?或者我如何设置权限?

谢谢! 迈克尔

3 个答案:

答案 0 :(得分:0)

您的服务器需要设置安全策略。您需要一个JVM属性,如:

-Djava.security.policy=/path/to/myserver.policy

其中myserver.policy是包含服务器安全策略的文件,例如:

grant {  
    permission java.security.AllPermission "", "";  
};

在相关的说明中,我个人并不是RMI的忠实粉丝,因为它过去给了我greif,它处理服务器和客户端之间的类版本控制,以及它特定于Java的事实,因此限制了客户端用Java编写。如果您可以灵活地选择不同的客户端 - 服务器技术,那么您应该看看SOAP(AXIS2还不错)或REST服务(Restlet看起来很有前途)。这篇文章可能会帮助您获得利弊:

http://michaeldehaan.net/2008/07/17/xmlrpc-vs-rest-vs-soap-vs-all-your-rpc-options/

答案 1 :(得分:0)

http://download.oracle.com/javase/tutorial/rmi/client.html

看看那个。它清楚地说明了如何在客户端中实例化SecurityManager作为确保下载存根的第一步。

答案 2 :(得分:0)

您根本不需要JDK 1.5中的存根。请参阅UnicastRemoteObject的类Javadoc。