Клиент не может подключиться к реестру RMI при использовании ProcessBuilder

Если я создаю реестр RMI из командной строки, у клиента не возникнет проблем с привязкой объектов к реестру.

Однако, если я запускаю реестр RMI с помощью ProcessBuilder, это дает ошибку.

Это мой код для создания rmiregistry с использованием ProcessBuilder

ProcessBuilder obj = new ProcessBuilder ("rmiregistry","2500");

Process obj_process = obj.start();

Ошибка, которую я получаю при использовании ProcessBuilder, когда пытаюсь выполнить привязку к своему собственному реестру RMI

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 — это интерфейс

Любые идеи?


person xavier666    schedule 10.09.2012    source источник


Ответы (2)


Я не понимаю, почему вы запускаете отдельный процесс, когда вы можете использовать LocateRegistry.createRegistry(). Если бы вы это сделали, эта проблема также исчезла бы.

person user207421    schedule 11.09.2012

Исключение возникает из-за того, что приложение rmiregistry не знает, откуда загружать классы. Когда вы пытаетесь связать объект в реестре RMI, реестр загружает определение класса для этого объекта.

Правильный способ решения проблемы — установить свойство java.rmi.server.codebase.

(щелкните правой кнопкой мыши на своем проекте-> запустить как-> запустить конфигурацию-> Аргументы-> Аргументы виртуальной машины).

Свойство требует, чтобы путь к каталогу заканчивался косой чертой, например:

-Djava.rmi.server.codebase=файл:${workspace_location}/папка/

У вас также могут возникнуть проблемы, если переменная ${workspace_location} является относительным путем, а приложение rmiregistry не было запущено в том же каталоге, поэтому относительный путь для него неверен. Если вы либо сделаете путь абсолютным, либо запустите реестр rmire в соответствующем каталоге, исключение ClassNotFoundException должно исчезнуть. См. руководство по java.rmi.server.codebase. для более подробной информации.

Надеюсь, поможет.

Кредиты этому парню

person F. Mayoral    schedule 10.09.2012
comment
файл: кодовые базы работают правильно только в том случае, если все клиенты также работают на локальном хосте. Существуют и другие способы заставить реестр работать, не связанные с кодовыми базами, например, указав аргумент CLASSPATH env var или classpath при его запуске. - person user207421; 11.09.2012
comment
Нет, я совсем не это имел в виду. Я сказал, что «есть другие способы заставить реестр работать, которые не затрагивают кодовую базу». Пожалуйста, не пытайтесь переводить от моего имени. - person user207421; 11.09.2012
comment
Эти методы не имеют ничего общего с вопросом OP, который был чем-то вроде этой ошибки, как я могу ее решить?, а не как я могу создать реестр rmi?, иначе мой первоначальный ответ был бы другим. - person F. Mayoral; 11.09.2012
comment
Вопрос ОП заключается в том, как исправить его проблему с реестром. Он может сделать это с помощью переменной среды CLASSPATH, с помощью -J-Dclasspath, с помощью функции кодовой базы или с помощью Locate.Registry.createRegistry(). Все это действительные решения проблемы ОП, и ни одно из них ничем не исключается в его вопросе. Проблема с вашим ответом в том, что вы представили только один из этих методов как «правильный»; вы не упомянули проблему с файлом: кодовые базы, которые я поднял; впоследствии вы объединили почти все из них как функции кодовой базы, когда они таковыми не являются; и вы исказили это как мой комментарий. - person user207421; 11.09.2012
comment
Кодовая база на самом деле предназначена для динамической загрузки удаленных ресурсов, я не знаю, откуда вы взяли, что кодовая база предназначена для локальных клиентов, но это не так, вы только что это сказали, вы можете определить функцию кодовой базы в пути к классу, это именно то, что я сказал в ответ на ваш первый комментарий, это все еще кодовая база, если вам это не нравится, вы всегда можете добавить свой собственный ответ ;), спасибо за ваши комментарии! docs.oracle.com/javase/6/docs/ технические заметки/руководства/rmi/ - person F. Mayoral; 11.09.2012
comment
@ fer13488 Я думаю, что ваше решение жизнеспособно, но для меня оно слишком сложное. (я просто новичок) мне в итоге помог метод EJP про createRegistry - person xavier666; 11.09.2012
comment
Ты продолжаешь понимать все, что я говорю, задом наперед. Проблема с кодовыми базами file:, как вы предлагаете, заключается в том, что они работают только локально, потому что URL-адрес file: не будет иметь того же значения для удаленного клиента. Кодовые базы HTTP работают везде. Кодовая база определяется в системном свойстве java.rmi.server.codebase. Вы не можете «определить кодовую базу в CLASSPATH». Вы продолжаете смешивать «кодовую базу» и «ПУТЬ К КЛАССУ», как будто это одно и то же. Это не так. Я предлагаю вам прочитать мою книгу по RMI для дальнейшего просветления. - person user207421; 12.09.2012