В обоих случаях вашему приложению потребуется добавить некоторый тривиальный код, который будет выполняться при запуске, чтобы обойти эти две проблемы.
Подстановочные знаки не допускаются в значениях свойств
В спецификации JNLP говорится:
Ожидается, что клиент JNLP внесет в черный список (или ограничит) определенные элементы jnlp и значения аргументов, такие как java-vm-args или имя и значение свойства, для обеспечения безопасности. Точный список зависит от индивидуальных реализаций клиента JNLP.
Фактически, реализация Oracle (по крайней мере, в 7u45) заносит в черный список атрибут value
элемента <property/>
— его нельзя использовать подстановочные знаки. Мне не удалось найти причину этого решения, но она есть.
Обходной путь веб-запуска позволяет произвольные имена свойств, а также значения; обходной путь апплета требует, чтобы имена свойств были известны во время подписания кода.
Обходной путь: веб-запуск
В файле JNLP включите несколько аргументов с подстановочными знаками:
<application-desc main-class="com.example.YourMainClass">
<argument>*</argument>
<argument>*</argument>
</application-desc>
В методе main
вашего приложения проанализируйте эти аргументы и скопируйте их в системные свойства, используя System.setProperty()
, пропуская аргументы, которые все еще имеют буквальное значение "*"
. Я рекомендую просто разделить каждый аргумент при первом появлении "="
. (Если ваше приложение уже принимает обычные аргументы, вам придется проявить немного изобретательности.)
Обходной путь: апплет
В файле JNLP включите параметры, определяющие свойства системы, которые необходимо установить:
<applet-desc main-class="com.example.YourMainClassApplet">
<param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
<param name="prop1" value="*"/>
<param name="prop2" value="*"/>
</applet-desc>
В вашем Applet.init()
метод, получите значение параметра SYS_PROPERTY_PARAMETERS
и повторите его, чтобы получить значение каждого параметра. Если это не литерал "*"
, скопируйте его в системное свойство, используя System.setProperty()
.
Диалоговое окно «Небезопасная операция»
Это ошибка в подключаемом модуле Oracle, вызванная использованием LiveConnect ( Взаимодействие Java ‹-› JavaScript).
Обходной путь: безопасные префиксы свойств
Префикс всех системных свойств, установленных через элементы <property/>
в JNLP, с префиксом "jnlp."
:
<property name="jnlp.my-prop" value="fixed-value"/>
Затем в методе main()
или Applet.init()
вашего приложения переберите копию System.getProperties()
и, если имя свойства начинается с "jnlp."
, скопируйте его значение в свойство с таким же именем, убрав этот префикс. (Итерация по копии необходима, чтобы избежать ConcurrentModificationException
.)
Подсказка: валидатор шаблонов JNLP учитывает порядок атрибутов XML
Наконец, если ваш процесс заполнения значений свойств может привести к переупорядочению атрибутов других элементов в документе JNLP, это может привести к сбою проверки шаблона JNLP. (Синтаксический анализ JNLP с помощью синтаксического анализатора DOM, заполнение подстановочных знаков и отправка его обратно с использованием StreamResult
— это один из способов, которым это может произойти.) Например, у меня были эти два элемента с несколькими атрибутами, и порядок элементов должен был совпадать. :
<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>
person
Matt McHenry
schedule
06.12.2013