Как мне установить classpath, который использует rmiregistry? - PullRequest
15 голосов
/ 25 февраля 2012

Я пытаюсь создать приложение клиент / сервер Java RMI.Я сталкиваюсь с проблемами при запуске серверной части моего приложения, так как оно продолжает работать в ClassNotFoundException во время вызова метода Registry.bind (), когда я пытаюсь запустить серверную часть приложения.app.

Я начал с простого урока здесь: http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html. После выполнения этих инструкций он изначально выдавал исключение ClassNotFoundException с жалобой на то, что не может найти "example.hello.Hello".Я смог решить это, запустив каталог rmiregistry FROM destDir в учебном пособии, поскольку rmiregistry, по-видимому, использует свой начальный начальный каталог как часть своего пути к классам.

Я запустил свой каталогдругое тестовое приложение после этого, и я был в порядке, пока я не начал использовать сторонние jar-файлы в своем классе сервера.Теперь Registry.bind () генерирует исключение ClassNotFoundException, если мой класс сервера ссылается на что-либо в любом jar-файле, поскольку приложение rmiregistry не знает об этих jar-файлах.

Насколько я могу судить, rmiregistry не принимает никакихсвоего рода аргумент при запуске classpath, поэтому мне интересно, как я могу сказать, какой classpath я хочу, чтобы он подтвердил.В соответствии с руководством здесь: http://docs.oracle.com/javase/tutorial/rmi/running.html, "вы должны убедиться, что оболочка или окно, в котором вы будете запускать rmiregistry, либо имеют no переменную среды CLASSPATH, либо имеютПеременная среды CLASSPATH, которая не включает путь к каким-либо классам, которые вы хотите загрузить на клиенты ваших удаленных объектов. "Это звучит как противоположность того, что мне нужно ... или я читаю это неправильно?Кто-нибудь имел какой-либо успех при запуске клиента / сервера RMI, который использует сторонние jar-файлы (commons-io, commons-logging и rmiio, в моем случае)?

Это, кстати, на Windows.


Обновление Я нашел способ обойти это.Смотрите мой ответ ниже.

Ответы [ 4 ]

5 голосов
/ 14 мая 2014

Замечания об отмене сброса CLASSPATH применяются только в том случае, если вы используете функцию кодовой базы RMI, поскольку подразумевается загадочное замечание о загрузке классов.

Если вы не используете функцию кодовой базы, простолибо:

  1. Установите переменную среды CLASSPATH, как требуется, перед запуском rmiregistry,, как показано здесь в другом месте, или
  2. Запуск rmiregistry с -J-Djava.class.path=...
  3. ЗапускРеестр внутри вашего сервера JVM с LocateRegistry.createRegistry(). Это во многих отношениях лучшее решение, так как он живет и умирает с JVM, разделяет его путь к классу и, кстати, также соответствует требованиям для функции кодовой базы.

Если вы выполняете (3), вы должны сохранить возвращаемое значение в статической переменной, чтобы предотвратить его сборку мусора, что приводит к неэкспортировке реестра, что может привести к DGC удаленного объекта, которыйможет привести к тому, что это будет GC'd, что приведет к выходу из прослушивающего потока, что может привести к выходу всей JVM.

4 голосов
/ 03 декабря 2013

(Первоначально я опубликовал этот ответ как обновление своего вопроса. В соответствии с предложением Зекаса в одном из комментариев я перемещаю его в раздел ответов.)

Мне удалось получить серверчасть, чтобы начать, не повинуясь предложению во втором уроке, указанном в моем вопросе выше:

"Вы должны убедиться, что оболочка или окно, в котором вы будете запускать rmiregistry, имеет no Переменная окружения CLASSPATH установлена ​​или имеет переменную окружения CLASSPATH, которая не включает путь к каким-либо классам, которые вы хотите загрузить на клиенты ваших удаленных объектов. "

Я создалпеременную среды CLASSPATH и добавили в нее мой выходной каталог .class и каждый из сторонних jar-файлов.Я думал, что пытался сделать это раньше, но, думаю, нет ... Просто думал, что оставлю свое решение на случай, если у кого-то еще возникнет такая же проблема.

4 голосов
/ 12 декабря 2012

Не существует пути к классу Java для RMI.Он должен использовать тот же путь к классам, что и остальная часть системы Java.Вы можете установить ваш classpath, указав его в командной строке или в вашей операционной системе.Несмотря на то, что документ немного устарел, он должен указывать вам правильное направление.

1 голос
/ 14 мая 2014

Пример того, как установить classpath для rmiregistry

Win32:

set CLASSPATH=c:\home\ann\src;c:\home\ann\public_html\classes\compute.jar 

UNIX:

setenv CLASSPATH /home/ann/src:/home/ann/public_html/classes/compute.jar
...