Хорошо, у меня есть он. Это wasn´ t rmiregistry свойство (работает без любых параметров). В моем VM-параметре кодовой базы было две ошибки:
-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy
... должен вместо этого быть похожим на это:
-Djava.rmi.server.codebase=file:/C:/ProjX/server/serverProj/bin/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy
=> file:/ (только одна наклонная черта) + неправильное окончание пакета.
, Но трассировка так сбивало с толку, моя первая мысль была, что что-то должно быть неправильным с файлом политики или конфигурацией политики.
, Тем не менее: Спасибо за справку и счастливое взламывание. ;-)
Предоставление всех полномочий ко всему коду является действительно плохим. Любой клиент RMI мог сделать то, что это хотело, как вошел в систему пользователь. В общей попытке ограничить полномочия так же как разумный, особенно когда Вы не знаете, куда код прибыл из.
Назад к вопросу...
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
, Который должен быть или "file:///C:/..."
или "file:/C:/..."
. Думайте о http. "http://C:/..."
относится к хосту, названному C
. Обратите внимание, что сообщение об исключении отбросило двоеточие, потому что это - просто синтаксис для номера порта.
причина, почему Вы получаете исключение безопасности даже при предоставлении разрешений ко всему коду состоит в том, что RMI ограничивает полномочия этим соответствующим, учитывая включенные URL (использование AccessController doPrivileged две формы аргумента).
Я думаю, что исключение на самом деле выходит из rmiregistry. Эта часть отслеживания стека - то, что заставляет меня думать так. Тупик для rmiregistry получает исключение и пасует назад его как результат попытки снова переплести.
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
Попытка, работающая rmiregistry с -J-Djava.security.policy=all.policy
, где файл политики дает все разрешения (по крайней мере, для получения вещей, идущих).
В конечном счете можно также хотеть переключиться на URL кодовой базы HTTP, именно так что можно выполнить клиенты на машине, отдельной от сервера.
Можно также установить программно java.rmi.server.codebase свойство:
Hello h = null;
Properties props = System.getProperties();
System.setProperty("java.rmi.server.codebase", "file:/C:/PROJECTX/bin/");
try {
h = new HelloImpl();
Naming.bind("//localhost:1099/HelloService", h);
System.out.println("Serwis gotów...");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
для немного гипотетических Hello
сервис RMI.