Перейти к основному содержимому

Руководство по Java Web Start

· 6 мин. чтения

1. Обзор

В этой статье объясняется, что такое Java Web Start (JWS), как настроить его на стороне сервера и как создать простое приложение.

Примечание . JWS был удален из Oracle JDK, начиная с Java 11. В качестве альтернативы рассмотрите возможность использования OpenWebStart .

2. Введение

JWS — это среда выполнения, которая поставляется с Java SE для веб-браузера клиента и существует с версии Java 5.

С загрузкой файлов JNLP (также известных как протокол запуска сети Java) с веб-сервера эта среда позволяет нам удаленно запускать пакеты JAR, на которые она ссылается.

Проще говоря, механизм загружает и запускает классы Java на клиентском компьютере с обычной установкой JRE. Это также позволяет получить некоторые дополнительные инструкции от Jakarta EE. Однако ограничения безопасности строго применяются JRE клиента, обычно предупреждая пользователя о ненадежных доменах, отсутствии HTTPS и даже неподписанных JAR.

С общего веб-сайта можно загрузить файл JNLP для запуска приложения JWS. После загрузки его можно запустить непосредственно с ярлыка на рабочем столе или с помощью Java Cache Viewer. После этого он загружает и выполняет файлы JAR.

Этот механизм может быть очень полезен для предоставления графического интерфейса, который не основан на веб-интерфейсе (без поддержки HTML), такого как приложение для безопасной передачи файлов, научный калькулятор, защищенная клавиатура, локальный браузер изображений и т. д.

3. Простое приложение JNLP

Хороший подход — написать приложение и упаковать его в файл WAR для обычных веб-серверов. Все, что нам нужно, это написать желаемое приложение (обычно на Swing) и упаковать его в файл JAR. Затем этот JAR должен быть, в свою очередь, упакован в файл WAR вместе с JNLP, который будет ссылаться, загружать и выполнять основной класс своего приложения в обычном режиме.

Нет никакой разницы с обычным веб-приложением, упакованным в файл WAR, за исключением того факта, что нам нужен файл JNLP для включения JWS, как будет показано ниже.

3.1. Java-приложение

Начнем с написания простого Java-приложения:

public class Hello {
public static void main(String[] args) {
JFrame f = new JFrame("main");
f.setSize(200, 100);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("Hello World");
f.add(label);
f.setVisible(true);
}
}

Мы видим, что это довольно простой класс Swing. Действительно, ничего не было добавлено, чтобы сделать его совместимым с JWS.

3.2. Веб приложение

Все, что нам нужно, это упаковать JAR этот пример класса Swing в файл WAR вместе со следующим файлом JNLP:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
codebase="http://localhost:8080/jnlp-example">
<information>
<title>Hello</title>
<vendor>Example</vendor>
</information>
<resources>
<j2se version="1.2+"/>
<jar href="hello.jar" main="true" />
</resources>
<application-desc/>
</jnlp>

Давайте назовем его hello.jndl и поместим в любую веб-папку нашего WAR. И JAR, и WAR можно загрузить, поэтому нам не нужно беспокоиться о том, чтобы поместить JAR в папку lib .

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

Давайте исправим это с помощью надлежащего сервлета позже в этой статье. А пока давайте просто поместим файл JAR для загрузки в корневую папку как index.html и свяжем его с элементом привязки:

<a href="hello.jnlp">Launch</a>

Давайте также установим основной класс в нашем манифесте JAR . Этого можно добиться, настроив подключаемый модуль JAR в файле pom.xml . Точно так же мы перемещаем файл JAR за пределы WEB-INF/lib , поскольку он предназначен только для загрузки, то есть не для загрузчика классов:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>
com.example.Hello
</mainClass>
</manifest>
</archive>
<outputDirectory>
${project.basedir}/target/jws
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

4. Специальные конфигурации

4.1. Проблемы с безопасностью

Чтобы запустить приложение, нам нужно подписать JAR . Создание действительного сертификата и использование подключаемого модуля JAR Sign Maven выходит за рамки этой статьи, но мы можем обойти эту политику безопасности в целях разработки или если у нас есть административный доступ к компьютеру нашего пользователя.

Для этого нам нужно добавить локальный URL-адрес (например: http://localhost:8080 ) в список исключений безопасности установки JRE на компьютере, где будет выполняться приложение. Его можно найти, открыв панель управления Java (в Windows мы можем найти ее через панель управления) на вкладке «Безопасность».

5. JnlpDownloadServlet

5.1. Алгоритмы сжатия

Есть специальный сервлет, который можно включить в наш WAR. Он оптимизирует загрузку, ища наиболее сжатую скомпилированную версию нашего JAR-файла, если она доступна, а также исправляет жестко закодированное значение кодовой базы в файле JLNP.

Поскольку наш JAR будет доступен для загрузки, рекомендуется упаковать его с помощью алгоритма сжатия, такого как Pack200, и доставить обычный JAR и любую сжатую версию JAR.PACK.GZ или JAR.GZ в одну и ту же папку, чтобы этот сервлет мог выбрать лучший вариант для каждого случая.

К сожалению, пока нет стабильной версии плагина Maven для этого алгоритма сжатия, но мы можем работать с исполняемым файлом Pack200, который поставляется с JRE (обычно устанавливается по пути {JAVA_SDK_HOME}/jre/bin/ ).

Не изменяя наш JNLP и помещая версии JAR jar.gz и jar.pack.gz в одну и ту же папку, сервлет выбирает лучшую версию после получения вызова от удаленного JNLP. Это повышает удобство работы пользователей и оптимизирует сетевой трафик.

5.2. Динамическая замена кодовой базы

Сервлет также может выполнять динамическую замену жестко заданных URL-адресов в теге <jnlp spec="1.0+" codebase="http://localhost:8080/jnlp-example"> . Изменив JNLP на подстановочный знак <jnlp spec=”1.0+” codebase=”$$context”> , он предоставляет тот же окончательный отображаемый тег.

Сервлет также работает с подстановочными знаками $$codebase , $$hostname , $$name и $$site , которые будут разрешать « http://localhost:8080/jnlp-example/ », « localhost:8080 », « hello. jnlp » и « http://localhost:8080 » соответственно.

5.3. Добавление сервлета в путь к классам

Чтобы добавить сервлет, давайте настроим обычное сопоставление сервлета для шаблонов JAR и JNLP с нашим web.xml :

<servlet>
<servlet-name>JnlpDownloadServlet</servlet-name>
<servlet-class>
jnlp.sample.servlet.JnlpDownloadServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JnlpDownloadServlet</servlet-name>
<url-pattern>*.jar</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JnlpDownloadServlet</servlet-name>
<url-pattern>*.jnlp</url-pattern>
</servlet-mapping>

Сам сервлет поставляется в виде набора JAR-файлов ( jardiff.jar и jnlp-servlet.jar ), которые в настоящее время находятся в разделе «Демонстрации и примеры» на странице загрузки Java SDK.

В примере GitHub эти файлы включены в папку java-core-samples-lib и включены в качестве веб-ресурсов подключаемым модулем Maven WAR:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
...
<configuration>
<webResources>
<resource>
<directory>
${project.basedir}/java-core-samples-lib/
</directory>
<includes>
<include>**/*.jar</include>
</includes>
<targetPath>WEB-INF/lib</targetPath>
</resource>
</webResources>
</configuration>
</plugin>

6. Заключительные мысли

Java Web Start — это инструмент, который можно использовать в средах (интрасети), где нет сервера приложений. Также для приложений, которым необходимо манипулировать локальными пользовательскими файлами.

Приложение доставляется конечному пользователю с помощью простого протокола загрузки без каких-либо дополнительных зависимостей или настроек, за исключением некоторых проблем безопасности (HTTPS, подписанный JAR и т. д.).

В Git Example полный исходный код, описанный в этой статье, доступен для скачивания. Мы можем загрузить его прямо с GitHub в ОС с Tomcat и Apache Maven. После загрузки нам нужно запустить команду mvn install из исходного каталога и скопировать сгенерированный файл jws.war из целевого в папку webapps установки Tomcat.

После этого мы можем запустить Tomcat как обычно.

При установке Apache Tomcat по умолчанию пример будет доступен по URL-адресу http://localhost:8080/jws/index.html .