使用 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 注册表的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中使用 ProcessBuilder 读取输出 git-bash
修改 PB 配置时,ProcessBuilder 产生了进程行为
无法使用 ssl 和 apache 连接到 websocket