使用 ProcessBuilder 时客户端无法连接 RMI 注册表

Posted

技术标签:

【中文标题】使用 ProcessBuilder 时客户端无法连接 RMI 注册表【英文标题】:Client fails to connect with RMI registry when using ProcessBuilder 【发布时间】:2012-09-10 21:20:01 【问题描述】:

如果我从命令行创建 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 是一个接口

有什么想法吗?

【问题讨论】:

【参考方案1】:

当您可以使用 LocateRegistry.createRegistry() 时,我不明白您为什么要启动一个单独的进程。如果你这样做了,这个问题也会消失。

【讨论】:

【参考方案2】:

发生异常是因为 rmiregistry 应用程序不知道从哪里加载类。当您尝试在 RMI 注册表中绑定对象时,注册表会下载该对象的类定义。

处理问题的正确方法是设置java.rmi.server.codebase属性

(右键单击您的项目->运行方式->运行配置->参数->VM参数)。

该属性要求目录路径以正斜杠结尾,如下所示:

-Djava.rmi.server.codebase=file:$workspace_location/folder/

如果 $workspace_location 变量是相对路径并且 rmiregistry 应用程序未在同一目录中启动,因此相对路径不正确,您也可能会遇到问题。如果您将路径设置为绝对路径,或者在适当的目录中启动 rmiregistry,ClassNotFoundException 应该会消失。有关更多详细信息,请参阅有关 java.rmi.server.codebase 属性的教程。

希望对你有帮助。

感谢this guy

【讨论】:

文件:代码库只有在所有客户端都在本地主机上运行时才能正常工作。还有其他方法可以使 Registry 工作不涉及代码库,例如在运行时指定 CLASSPATH env var 或 classpath 参数。 不,我根本不是这个意思。我是“还有其他方法可以使注册表工作,而不涉及代码库”。请不要尝试代表我翻译。 这些方法与 OP 问题无关,类似于“我有这个错误,我该如何解决?”,而不是“我如何创建 rmi 注册表?”,否则我最初的答案会有所不同。 OP 的问题是如何解决他的注册表问题。他可以使用 CLASSPATH 环境变量、使用 -J-Dclasspath、使用代码库功能或使用 Locate.Registry.createRegistry() 来做到这一点。这些都是 OP 问题的有效解决方案,并且没有一个被他的问题中的任何内容排除在外。您的答案的问题是您仅将其中一种方法作为“正确方法”提出;你没有提到我提出的 file: codebases 的问题;随后,您将几乎所有这些功能混为一谈,而实际上它们并非如此;你把我的评论歪曲了。 代码库实际上是用于动态加载远程资源的,我不知道你从哪里得到的代码库是用于本地客户端的但不是那样的,你刚刚说过,你可以定义代码库功能在类路径,这正是我在回应您的第一条评论时所说的,它仍然是一个代码库,如果您不喜欢它,您可以随时添加您自己的回复;),感谢您的 cmets! docs.oracle.com/javase/6/docs/technotes/guides/rmi/…

以上是关于使用 ProcessBuilder 时客户端无法连接 RMI 注册表的主要内容,如果未能解决你的问题,请参考以下文章

GWT + ProcessBuilder

在 Java 中使用 ProcessBuilder 读取输出 git-bash

修改 PB 配置时,ProcessBuilder 产生了进程行为

无法使用 ssl 和 apache 连接到 websocket

当两者都连接到同一个热点时,客户端无法访问服务器上托管的网站

为啥客户端无法连接到 Java Websocket 服务器?