如果我从命令行创建RMI注册表,则客户端将对象绑定到注册表没有问题。
但是,如果我使用ProcessBuilder
启动RMI注册表,则会出现错误。
这是我使用ProcessBuilder
创建rmiregistry
的代码
ProcessBuilder obj = new ProcessBuilder ("rmiregistry","2500");
Process obj_process = obj.start();
当我试图绑定到我自己的RMI注册表时,我使用ProcessBuilder
时遇到的错误
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: node_func
node_func
是一个接口
有什么想法吗?
我不明白为什么你可以使用LocateRegistry.createRegistry()来启动一个单独的过程。如果你这样做了,这个问题也会消失。
发生异常是因为rmiregistry应用程序不知道从哪里加载类。当您尝试在RMI注册表中绑定对象时,注册表会下载该对象的类定义。
处理这个问题的正确方法是设置java.rmi.server.coreduct属性
(右键单击您的项目->运行方式->运行配置->参数->VM参数)。
该属性要求目录路径以正斜杠终止,如下所示:
-Djava.rmi.server.codebase=文件:${workspace_location}/文件夹/
如果${workspace_location}变量是一个相对路径,而rmiregistry应用程序不是在同一目录中启动的,因此相对路径不正确,您也可能会遇到问题。如果您将路径设为绝对路径,或者在适当的目录中启动rmiregistry,则ClassNotFoundException应该会消失。有关更多详细信息,请参阅java.rmi.server.coreduct属性的教程。
希望能有所帮助。
归功于这个家伙