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

Java 使用ProcessBuilder时,客户端无法连接到RMI注册表,java,process,rmi,processbuilder,rmiregistry,Java,Process,Rmi,Processbuilder,Rmiregistry,如果我是从命令行创建RMI注册表,那么客户机在将对象绑定到注册表时没有问题 但是,如果我使用ProcessBuilder启动RMI注册表,则会出现错误 这是我使用ProcessBuilder创建注册表的代码 ProcessBuilder obj = new ProcessBuilder ("rmiregistry","2500"); Process obj_process = obj.start(); 当我尝试绑定到自己的RMI注册表时,由于使用ProcessBuilder而导致的错误 ja

如果我是从命令行创建RMI注册表,那么客户机在将对象绑定到注册表时没有问题

但是,如果我使用
ProcessBuilder
启动RMI注册表,则会出现错误

这是我使用ProcessBuilder创建注册表的代码

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
是一个接口


有什么想法吗?

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

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

(右键单击项目->运行方式->运行配置->参数->虚拟机参数)

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

-Djava.rmi.server.codebase=文件:${workspace\u location}/文件夹/

如果${workspace\u location}变量是相对路径,并且rmiregistry应用程序未在同一目录中启动,因此相对路径不正确,则也可能会遇到问题。如果将路径设置为绝对路径,或者在适当的目录中启动RMI注册表,则ClassNotFoundException应该消失。有关更详细的信息,请参见该属性的教程

希望能有帮助


归功于

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

file:codebase只有在所有客户端都在本地主机上运行时才能正常工作。还有其他不涉及代码库的方法使注册表工作,例如在运行它时指定CLASSPATH env var或CLASSPATH参数。不,这根本不是我的意思。我说的是‘有其他方法可以让注册表工作,而不涉及代码库’。请不要试图代表我翻译。这些方法与OP问题无关,比如“我有这个错误,我如何解决它?”,而不是“我如何创建rmi注册表?”,否则我的初始答案会有所不同。OP的问题是如何解决他的注册表问题。他可以使用CLASSPATH环境变量、-J-Dclasspath、codebase特性或Locate.Registry.createRegistry()来完成。这些都是OP问题的有效解决方案,在他的问题中没有一个被排除在外。你回答的问题是,你只提出了其中一种方法作为“正确的方法”;您没有提到文件的问题:我提出的代码库;随后,您将几乎所有这些特性合并为代码库特性,但它们不是;你把它误解为我的评论。代码库实际上是用于远程资源的动态加载,我不知道你从哪里得到的代码库是用于本地客户端的,但不是这样的,你刚刚说了,你可以在类路径中定义代码库功能,这正是我在回应你的第一个评论时说的,它仍然是一个代码库,如果您不喜欢,您可以随时添加自己的回复;),谢谢你的评论!