Я пытаюсь создать клиентское/серверное приложение Java RMI. У меня возникают проблемы с запуском серверной части моего приложения, так как он продолжает работать в ClassNotFoundException во время вызова метода Registry.bind(), когда я пытаюсь запустить серверную часть приложения.
Я начал с простого учебника здесь: http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html. После выполнения этих инструкций изначально было выбрано ClassNotFoundException, жалуясь, что он не смог найти "example.hello.Hello". Я смог решить это, запустив rmiregistry из каталога destDir в учебнике, так как rmiregistry, по-видимому, использует свой начальный каталог запуска как часть своего пути к классам.
После этого я начал работу с другим тестовым приложением, и все было в порядке, пока я не начал использовать сторонние файлы jar в своем классе сервера. Теперь Registry.bind() выдает исключение ClassNotFoundException, если мой класс сервера ссылается на что-либо в любом файле jar, поскольку приложение rmiregistry не знает об этих файлах jar.
Насколько я могу судить, rmiregistry не принимает какой-либо атрибут startpath для classpath, поэтому мне интересно, как я могу сказать, какой classpath я хочу, чтобы он признал. В соответствии с инструкцией здесь: http://docs.oracle.com/javase/tutorial/rmi/running.html, "вы должны убедиться, что оболочка или окно, в котором вы будете запускать rmiregistry, имеют no CLASSPATH, или имеет переменную среды CLASSPATH, которая не включает путь к любым классам, которые вы хотите загрузить клиентам ваших удаленных объектов." Это звучит как противоположность тому, что мне нужно... или я читаю его неправильно? Кто-нибудь успел запустить клиент/сервер RMI, который использует сторонние банки (commons-io, commons-logging и rmiio, в моем случае)?
Это в Windows, по-своему.
Обновление
Я нашел способ обойти это. См. Мой ответ ниже.