Мой клиент RMI получает NoClassDefFoundErrors для Log4j при попытке запустить методы сервера - PullRequest
0 голосов
/ 08 ноября 2010

Я искал по всему Интернету, но не могу найти способ заставить код RMI вести себя так, как я хочу (например, вызов RPC).

Java: 1,5

Я пытаюсь настроить вызов RMI клиент / сервер - клиент должен вызвать метод "square ()" на сервере, сервер возводит в квадрат переданное число и возвращает его.

В процессе построения я поместил оператор log4j в метод сервера.

Когда я пытаюсь запустить клиент из командной строки, я ищу имя в реестре RMI, выполняю метод square () на локальном экземпляре и получаю «NoClassDefFoundError» для log4j на клиенте при попытке запустить метод square ().

Это говорит мне о том, что клиент пытается загрузить не только интерфейс, но и реализацию логики сервера. Что, для ситуации, в которой я нахожусь, не то, что я хочу.

Я посмотрел и посмотрел, и я не могу найти очевидного ответа на вопрос, как заставить систему запускать методы удаленно, как вызов RPC.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2010

Причина возникновения ошибки NoClassDefFoundError в том, что JVM / ClassLoader пытается создать новый экземпляр класса, но определение класса не найдено.

Убедитесь, что на вашем RMI-сервере и клиент существует log4j.jar или log4j-x.x.xx.jar (где x.x.xx - версия log4j) Скомпилируйте ваш проект и включите в него файл log4j.jar.

0 голосов
/ 09 ноября 2010

Я обнаружил проблему - моя реализация сервера не расширяла UnicastRemoteObject.Очевидно, это заставляет логику сервера RMI отправлять клиенту копию кода реализации сервера вместо тупого представления кода реализации сервера.

0 голосов
/ 08 ноября 2010

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

, если вы удалите вызов log4j изsquare() ;, это работает?

также, если вы делаете серверный вызов, это метод square() локально (например, когда ваш серверный процесс запускается), это работает?- это сообщит вам, если вы пропустили зависимость jar где-то в стеке вызовов log4j.

...