Как совместить веб-запуск java с RMI?

Я хочу распространить приложение для веб-запуска, которое использует RMI.

Я не хочу спрашивать у пользователя адрес сервера RMI, потому что веб-сайт, распространяющий приложение, также является сервером RMI.

Кроме того, я не знаю адрес сервера во время сборки, поэтому адрес должен быть добавлен с помощью специальной конфигурации в JNLP, или адрес должен быть предоставлен во время выполнения. Это предпочтительный способ: возможно ли это сделать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
1 788
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я точно не использовал Java RMI (я использовал Java Web Start с бинарным протоколом Гессен только для чего-то вроде RMI), но, по крайней мере, часть передачи адреса сервера клиентскому приложению Web Start должна быть простой. Когда вы создаете файл JNLP в своем приложении, добавьте адрес как свойство:

<jnlp>
  [...]
  <resources>
    [...]
    <property name = "serverAddress" value = "..." />
  </resources>
</jnlp>

Затем в клиентском коде прочтите это свойство:

String serverAddress = System.getProperty("serverAddress");

Я предполагаю, что веб-сайт, распространяющий приложение, знает свой адрес :)

Редактировать (с дополнительным ограничением незнания адреса во время сборки): Хм, веб-сайт, распространяющий приложение, является динамическим или статическим?

  1. динамический: либо динамически генерировать весь JNLP (со страницей JSP, dom4j или чем-то еще), либо читать "шаблонный" файл JNLP XML и заменять реальный адрес сервера на месте
  2. статические: я предполагаю, что человек, который развертывает сайт, должен вручную настроить правильный адрес в файле JNLP?

Спасибо! Я изменил вопрос в соответствии с вашим ответом, чтобы более полно отразить мои потребности.

michelemarcon 20.01.2009 12:56

И в сочетании с JnlpDownloadServlet (java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/…‌) вы можете легко написать: ... value = "$$ codebase".

Tobias Schulte 20.01.2009 13:47

Я использую заполнители переменных в своем jnlp:

...
<application-desc>
    <argument>{host}</argument>
    <argument>{port}</argument>
</application-desc>
...

И используйте сервлет-перехватчик, чтобы заменить их во время выполнения, когда JNLP обслуживается клиентом.

Там, где я работаю, мы делаем именно это и помещаем имя хоста реестра RMI в JNLP в соответствии с ответом Джоника. В Java 6u10 или u11 Sun закрыла несколько дыр в безопасности с помощью Webstart, включая проблему с динамическим JNLP. Чтобы удовлетворить все предупреждения системы безопасности, вы должны поместить идентичную копию вашего JNLP в основную банку вашей программы. Это сделано для того, чтобы третьи стороны не добавляли в ваш код дополнительные файлы jar-файлов или параметров. Программы будут работать без него, но пользователям будет показано уведомление о доверии.

Мы, делать, знаем адрес во время сборки, но у нас были другие проблемы с динамическим JNLP, и поэтому пришлось прибегать к предоставлению JNLP и JAR для каждой возможной настройки среды выполнения. Для нас это было больше головной болью при развертывании, чем проблемой для клиентов, но если вы подписываете свой дистрибутив, то об этом стоит знать.

JDK включает исходный код (в каталоге samples / jnlp / servlet) для сервлета, который вставляет соответствующие значения в файл JNLP. Вы можете использовать это, чтобы вставить имя хоста в файл JNLP.

Другие вопросы по теме