Как смешать веб-запуск Java с RMI?
-
19-08-2019 - |
Вопрос
Я хочу распространять приложение веб-старта, использующее RMI.
Я хочу не спрашивать у пользователя адрес сервера RMI, поскольку веб-сайт, распространяющий приложение, также является сервером RMI.
Более того, я не знаю адреса сервера во время сборки, поэтому адрес должен быть добавлен в JNLP с помощью специальной конфигурации или адрес должен быть предоставлен во время выполнения.Это предпочтительный способ:возможно ли это сделать?
Решение
Я не использовал Java RMI точно (я использовал только Java Web Start с двоичным кодом Hessian протокол для выполнения чего-то вроде RMI), но по крайней мере часть передачи адреса сервера клиентскому приложению Web Start должна быть простой. Когда вы генерируете файл JNLP в своем приложении, добавьте адрес как свойство:
<jnlp>
[...]
<resources>
[...]
<property name="serverAddress" value="..." />
</resources>
</jnlp>
Затем в коде клиента прочитайте это свойство:
String serverAddress = System.getProperty("serverAddress");
Я предполагаю, что веб-сайт, который распространяет приложение, знает свой собственный адрес:)
Изменить (с дополнительным ограничением незнания адреса во время сборки). Хм, сайт, распространяющий приложение, динамический или статический? Р> <Ол>
Другие советы
Где я работаю, мы делаем именно это и помещаем имя хоста реестра RMI в JNLP согласно ответу Jonik. В Java 6u10 или u11 Sun закрыла несколько дыр в безопасности с помощью Webstart, включая проблему с динамической JNLP. Чтобы удовлетворить все предупреждения безопасности, вы должны поместить идентичную копию вашего JNLP в основной файл вашей программы. Это сделано для того, чтобы третьи лица не добавляли в ваш код дополнительные файлы jar или параметры. Программы будут работать без него, но пользователям будет показано уведомление о доверии.
Мы знаем , что знаем адрес во время сборки, но у нас были другие проблемы с динамическим JNLP, поэтому нам пришлось прибегнуть к предоставлению JNLP и JAR для каждой возможной настройки во время выполнения. Для нас это было скорее головной болью при развертывании, а не проблемой для клиентов, но если вы подписываете свой дистрибутив, то об этом стоит знать.
JDK включает исходный код (в каталоге sample/jnlp/servlet) для сервлета, который вставляет соответствующие значения в файл JNLP.Вы можете использовать это для вставки имени хоста в файл JNLP.
Я использую переменные заполнители в моем jnlp:
...
<application-desc>
<argument>{host}</argument>
<argument>{port}</argument>
</application-desc>
...
И используйте сервлет-перехватчик, чтобы заменить их во время выполнения, когда JNLP подается клиенту.