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

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

1. обзор

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

2. Вступление

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

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

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

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

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

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

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

Нет разницы с обычным веб-приложением, упакованным в файл 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. Веб приложение

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



    
        Hello
        Example
    
    
        
        
    
    

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

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

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

Let’s also set the main class in our JAR Manifest. Этого можно достичь, настроив плагин JAR в файлеpom.xml. Точно так же мы перемещаем JAR-файл за пределыWEB-INF/lib, поскольку он предназначен только для загрузки, т.е. не для загрузчика классов:


    org.apache.maven.plugins
    maven-jar-plugin
    ...
    
        
            compile
            
                jar
            
            
                
                    
                        
                            com.example.Hello
                        
                    
                
                
                    ${project.basedir}/target/jws
                
            
        
    

4. Особые конфигурации

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

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

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

5. JnlpDownloadServlet

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

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

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

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

Не меняя JNLP и помещая версии JARjar.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_ and _site, которые разрешают «http://localhost:8080/jnlp-example/», «localhost:8080», «hello.jnlp» и «http://localhost:8080 ”соответственно.

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

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


    JnlpDownloadServlet
    
        jnlp.sample.servlet.JnlpDownloadServlet
    


    JnlpDownloadServlet
    *.jar


    JnlpDownloadServlet
    *.jnlp

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

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


    org.apache.maven.plugins
    maven-war-plugin
    ...
    
        
            
                
                    ${project.basedir}/java-core-samples-lib/
                
                
                    **/*.jar
                
                WEB-INF/lib
            
        
    

6. Последние мысли

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

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

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

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

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