«1. Обзор

В этой статье мы сделаем краткий обзор веб-сервера Jetty, а затем рассмотрим различные подходы к развертыванию файла WAR.

Jetty — это веб-сервер Java HTTP с открытым исходным кодом и контейнер сервлетов. Jetty чаще используется для межмашинного взаимодействия в экосистеме Java.

2. Настройка проекта

Последнюю версию Jetty всегда можно скачать по этой ссылке. Мы создадим очень простое веб-приложение Java из командной строки с помощью Maven, которое мы будем использовать в наших примерах.

В этой статье мы используем Jetty 9.x, последнюю версию на данный момент.

Давайте перейдем к нашей консоли, перейдем к выбранному местоположению и выполним следующую команду:

mvn archetype:generate -DgroupId=com.baeldung -DartifactId=jetty-app 
  -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Эта команда создаст полное веб-приложение Java в новой папке jetty-app в нашем текущем местоположении. Это всего лишь один из многих способов создания Java-приложения с помощью Maven, и он подходит для нашей цели.

Так как мы будем иметь дело с файлами WAR, давайте перейдем к корню проекта и соберем его:

cd jetty-app

Сборка с помощью Maven:

mvn package

Затем будет создан jetty-app.war расположение причал-приложение/цель/причал-приложение.война.

3. Структура причала

Контекстный путь. Относится к местоположению относительно адреса сервера и представляет имя веб-приложения.

Например, если наше веб-приложение помещено в каталог $JETTY_HOME\\webapps\\myapp, доступ к нему будет осуществляться по URL-адресу http://localhost/myapp, а его контекстный путь будет /myapp.

ВОЙНА. Является расширением файла, который упаковывает иерархию каталогов веб-приложений в формате ZIP и является сокращением от Web Archive. Веб-приложения Java обычно упаковываются в виде файлов WAR для развертывания. Файлы WAR можно создавать в командной строке или в среде IDE, такой как Eclipse.

4. Развертывание путем копирования WAR

Самый простой способ развернуть веб-приложение на сервере Jetty — это скопировать файл WAR в каталог $JETTY_HOME/webapps.

После копирования мы можем запустить сервер, перейдя к $JETTY_HOME и выполнив команду:

java -jar start.jar

Jetty будет сканировать свой каталог $JETTY_HOME/webapps при запуске для развертывания веб-приложений. Наше новое приложение будет развернуто в контексте /jetty-app.

Когда мы загружаем URL-адрес http://localhost:8080/jetty-app из браузера, мы должны увидеть, что наше приложение работает с Hello world! напечатаны на экране.

5. Развертывание с использованием файла контекста

Веб-сервер Jetty предлагает нам способ развертывания веб-архива, расположенного в любом месте файловой системы, путем создания для него файла контекста.

Таким образом, даже если наш WAR-файл находится на рабочем столе или мы решили сохранить его в папке jetty-app/target, куда Maven помещает пакет, мы можем просто создать его контекстный файл внутри $JETTY_HOME/webapps.

Давайте отменим развертывание файла jetty-app.war, который мы только что развернули, удалив его из веб-приложений. Затем мы создадим jetty-app.xml со следующим кодом и поместим его в веб-приложения:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
  "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/jetty</Set>
    <Set name="war">absolute/path/to/jetty-app.war</Set>
</Configure>

Этот файл контекста должен иметь то же имя, что и WAR, но с расширением XML. Обратите внимание, что мы установили для атрибута contextPath значение /jetty. Это означает, что мы будем получать доступ к нашему веб-приложению с URL-адреса http://localhost:8080/jetty.

Эта возможность настраивать контекстный путь является одним из больших преимуществ контекстного файла при развертывании WAR в Jetty, поскольку некоторые имена приложений могут быть неудобны для этой цели.

6. Развертывание с помощью подключаемого модуля Jetty Maven

6.1. Развертывание по умолчанию

Плагин jetty Maven помогает нам выполнять быстрое тестирование и итерацию при создании веб-приложений Java. Чтобы иметь возможность развертывать и запускать приложения с его помощью, нам нужно только добавить плагин в pom.xml:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.3.11.v20160721</version>
</plugin>

Последнюю версию можно найти, перейдя по этой ссылке Maven.

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

Чтобы развернуть наше приложение после добавления плагина, мы переходим в корень, где находится pom.xml, и запускаем следующую команду:

mvn jetty:run

«

«Эта команда создает новый экземпляр причала, и подключаемый модуль развертывает на нем приложение. Мы можем получить к нему доступ, загрузив http://localhost:8080.

Плагин jetty Maven постоянно сканирует веб-проект на предмет любых изменений и повторно развертывает его.

6.2. Изменение ContextPath

Из предыдущего подраздела приложение было развернуто в /context. Однако, если мы хотим выполнить развертывание по заданному пути контекста, такому как /jetty, как раньше, нам придется настроить плагин по-другому.

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.3.11.v20160721</version>
    <configuration>
        <webApp>
            <contextPath>/jetty</contextPath>
        </webApp>
    </configuration>
</plugin>

Мы изменим объявление плагина на следующий XML:

Обратите внимание, как мы добавили блок конфигурации для дальнейшей настройки нашего развертывания. Существует несколько вариантов конфигурации, которые можно разместить внутри этого блока в зависимости от того, что вы хотите.

После этих изменений мы можем повторно запустить плагин, как и раньше, и получить доступ к нашему приложению через http://localhost:8080/jetty.

6.3. Изменение порта

Сценарий, с которым можно столкнуться, — это исключение использования порта. Может быть, у нас есть экземпляр причала, работающий на порту 8080 для производства, но мы все еще находимся на этапе разработки и хотим извлечь выгоду из простоты итерации, связанной с развертыванием с помощью подключаемого модуля Maven.

<configuration>
    <webApp>
        <contextPath>/jetty</contextPath>
    </webApp>
    <httpConnector>
        <port>8888</port>
    </httpConnector>
</configuration>

В таких случаях мы должны запускать наш тестовый сервер на другом порту. Давайте изменим конфигурацию плагина на следующий XML:

Когда мы повторно запустим наш плагин Maven, мы сможем получить доступ к нашему приложению с http://localhost:8888/jetty.

Стоит отметить, что с плагином jetty Maven нам не нужно устанавливать и запускать экземпляр jetty. Скорее, он создает свой собственный экземпляр причала.

7. Развертывание с помощью Jetty Runner

Как и плагин jetty Maven, jetty-runner предлагает быстрый и простой способ развертывания и запуска нашего веб-приложения. С jetty-runner нам также не нужно устанавливать и запускать отдельный экземпляр сервера jetty.

7.1. Установка Jetty Runner

Чтобы использовать jetty-runner для быстрого развертывания и запуска наших веб-приложений, мы можем загрузить последнюю версию, перейдя по этой ссылке Maven.

С помощью jetty-runner нам нужно всего лишь поместить загруженный файл jar в любое место и быть готовым с путем файловой системы к нашим веб-архивам.

Мы можем передавать параметры конфигурации из командной строки, а также развертывать множество приложений в разных контекстах и ​​привязывать их к разным портам с помощью всего одной команды.

Я поместил свой jar-файл jetty-runner в ту же иерархию, что и каталог jetty-app. Это каталог, содержащий наше веб-приложение.

7.2. Базовое развертывание

java -jar jetty-runner-9.4.0.M1.jar jetty-app/target/jetty-app.war

Давайте развернем наш WAR с помощью jetty-runner:

Эта команда, как и в случае с подключаемым модулем Maven, создает экземпляр jetty и развертывает на нем предоставленный WAR. Путь WAR может быть абсолютным или относительным путем.

Мы можем загрузить это приложение, используя http://localhost:8080.

7.3. Развертывание с контекстным путем

java -jar jetty-runner-9.4.0.M1.jar --path /jetty jetty-app/target/jetty-app.war

Для развертывания в контексте /jetty, как и раньше:

Доступно через http://localhost:8080/jetty.

7.4. Развернуть на указанном порту

java -jar jetty-runner-9.4.0.M1.jar --port 9090 jetty-app/target/jetty-app.war

Для развертывания на заданном номере порта:

Доступно через http://localhost:9090.

7.5. Развертывание нескольких WAR-файлов

java -jar jetty-runner --path /one one.war --path /two two.war

Чтобы развернуть несколько WAR-файлов с помощью одной и той же команды, мы используем аргумент –path, чтобы сделать каждый из них уникальным:

Затем мы получаем доступ к one.war через http://localhost:8080/. один и два.война через http://localhost:8080/two.

8. Развертывание с помощью Cargo Maven Plugin

Cargo — это универсальная библиотека, которая позволяет нам стандартно манипулировать различными типами контейнеров приложений.

8.1. Настройка развертывания Cargo

В этом разделе мы рассмотрим, как использовать подключаемый модуль Cargo Maven для развертывания WAR на Jetty, в данном случае мы будем развертывать WAR на экземпляре Jetty 9.x.

mvn archetype:generate -DgroupId=com.baeldung -DartifactId=cargo-deploy 
  -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Чтобы лучше понять весь процесс, мы начнем с нуля, создав новое веб-приложение Java из командной строки:

Это создаст полное веб-приложение Java в каталоге cargo-deploy. . Если мы создадим, развернем и загрузим это приложение как есть, оно напечатает Hello World! в браузере.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://Java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://Java.sun.com/xml/ns/javaee 
      http://Java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

    <display-name>cargo-deploy</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

«Поскольку наше веб-приложение не содержит сервлетов, наш файл web.xml будет очень простым. Поэтому перейдите в папку WEB-INF нашего недавно созданного проекта и создайте файл web.xml, если он еще не был создан автоматически, со следующим содержимым:

Чтобы позволить Maven распознавать команды груза без ввода полного имени. , нам нужно добавить плагин Cargo Maven в группу плагинов в файле settings.xml Maven.

<pluginGroups>
    <pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>

В качестве непосредственного дочернего элемента корневого элемента \u003csettings\u003e\u003c/settings\u003e добавьте следующее:

8.2. Локальное развертывание

В этом подразделе мы отредактируем наш файл pom.xml в соответствии с нашими новыми требованиями к развертыванию.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.5.0</version>
            <configuration>
                <container>
                    <containerId>jetty9x</containerId>
                    <type>installed</type>
                    <home>Insert absolute path to jetty 9 installation</home>
                </container>
                <configuration>
                    <type>existing</type>
                    <home>Insert absolute path to jetty 9 installation</home>
                </configuration>
            </configuration>
       </plugin>
    </plugins>
</build>

Добавьте плагин следующим образом:

Обратите внимание, что мы явно определяем упаковку как WAR, без этого наша сборка не будет работать. Затем в разделе плагинов мы добавляем плагин cargo maven2.

Последняя версия на момент написания — 1.5.0. Однако последнюю версию всегда можно найти здесь. Кроме того, мы добавляем раздел конфигурации, в котором сообщаем Maven, что используем контейнер Jetty, а также существующую установку Jetty.

Установив установленный тип контейнера, мы сообщаем Maven, что у нас есть экземпляр Jetty, установленный на машине, и мы предоставляем абсолютный URL-адрес этой установки.

Установив существующий тип конфигурации, мы сообщаем Maven, что у нас есть существующая установка, которую мы используем, и дальнейшая настройка не требуется.

Альтернативой может быть указание Cargo загрузить и установить указанную версию Jetty, указав URL-адрес. Однако наше внимание сосредоточено на развертывании WAR.

Стоит отметить, что независимо от того, используем ли мы Maven 2.x или Maven 3.x, плагин cargo maven2 работает для обоих.

mvn install

Теперь мы можем установить наше приложение, выполнив:

mvn cargo:deploy

и развернуть его, запустив:

Если все пойдет хорошо в консоли Maven и Jetty, тогда мы сможем запустить нашу сеть. приложение, загрузив http://localhost:8080/cargo-deploy.

Если мы проверим папку $JETTY_HOME/webapps, мы найдем файл дескриптора развертывания или то, что мы ранее называли контекстным файлом, называемым cargo-deploy.xml, созданным Cargo.

8.3. Удаленное развертывание

По умолчанию Jetty не имеет возможностей для удаленного развертывания. Чтобы добавить такую ​​поддержку в Jetty, Cargo использует веб-приложение удаленного развертывания Jetty.

Это означает, что мы должны загрузить WAR-файл веб-приложения, предварительно созданный разработчиками Cargo, и развернуть этот WAR-файл в целевом контейнере причала.

Каждый раз, когда мы хотим выполнить развертывание на этом удаленном сервере с помощью плагина Cargo Maven, он отправляет HTTP-запрос приложению развертывания на удаленном сервере с нашим WAR для развертывания.

Этот удаленный развертыватель можно найти здесь. Перейдите в раздел инструментов и загрузите WAR-файл cargo-jetty-7-and-onwards-deployer.

Соображения безопасности

admin:password,manager

Мы должны настроить область безопасности в причале, прежде чем это заработает, для целей аутентификации. Создайте файл с именем realm.properties в каталоге $JETTY_HOME/etc удаленного сервера причала. Содержимое файла:

Администратор — это имя пользователя, под которым клиент может получить доступ к защищенным приложениям, пароль — это пароль, а менеджер — это роль, которой должны обладать клиенты, прежде чем им будет предоставлен доступ.

Мы также должны объявить наши требования безопасности в приложении развертывания. Мы распакуем файл WAR, который мы скачали со страницы загрузок пристани, внесем некоторые изменения и запакуем его обратно в файл WAR.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Jetty Remote Deployer</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>manager</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Test Realm</realm-name>
</login-config>

После распаковки перейдите к WEB-INF/web.xml и раскомментируйте XML-код с помощью Uncomment, чтобы активировать комментарий безопасности. Или поместите туда следующий код:

Развертывание деплойнера

Теперь мы можем упаковать приложение обратно в WAR и скопировать его в любое место на удаленном сервере. Затем мы развернем его на Jetty.

Во время развертывания лучше всего использовать файл дескриптора развертывания, чтобы мы могли создать securityHandler и передать ему loginService. Все защищенные приложения должны иметь службу входа в систему, иначе Jetty не сможет их развернуть.

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
  "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/deployer</Set>
    <Set name="war">absolute/path/to/cargo-jetty-deployer.war</Set>
    <Get name="securityHandler">
        <Set name="loginService">
            <New class="org.eclipse.jetty.security.HashLoginService">
                <Set name="name">Test Realm</Set>
                <Set name="config"><SystemProperty name="jetty.home" 
                   default="."/>/etc/realm.properties</Set>
            </New>
        </Set>
    </Get>
</Configure>

«Теперь давайте создадим файл контекста в $JETTY_HOME/webapps удаленного экземпляра причала, запомните правила именования файла контекста. Назовите его так же, как WAR:

HTTP ERROR 400

Problem accessing /cargo-jetty-deployer/. Reason:

    Command / is unknown

Запустите удаленный сервер причала, и если все пойдет хорошо, мы сможем загрузить http://localhost:8080/cargo-jetty-deployer. Затем мы должны увидеть что-то вроде:

Развертывание WAR на удаленном Jetty

Чтобы выполнить удаленное развертывание, нам нужно всего лишь изменить раздел конфигурации pom.xml. Удаленное развертывание означает, что у нас нет локальной установки Jetty, но есть аутентифицированный доступ к приложению развертывания, работающему на удаленном сервере.

<configuration>
    <container>
        <containerId>jetty9x</containerId>
        <type>remote</type>
    </container>
    <configuration>          
        <type>runtime</type>
        <properties>
      <cargo.hostname>127.0.0.1</cargo.hostname>
            <cargo.servlet.port>8080</cargo.servlet.port>
            <cargo.remote.username>admin</cargo.remote.username>
            <cargo.remote.password>password</cargo.remote.password>
        </properties>
    </configuration>
</configuration>

Итак, давайте изменим pom.xml так, чтобы раздел конфигурации выглядел так:

На этот раз мы изменим тип контейнера с установленного на удаленный и тип конфигурации с существующего на время выполнения. Наконец, мы добавляем в конфигурацию имя хоста, порт и свойства аутентификации.

mvn clean

очистить проект:

mvn install

установить его:

mvn cargo:deploy

наконец, развернуть его:

Вот и все.

9. Развертывание из Eclipse

Eclipse позволяет нам встраивать серверы, чтобы добавить развертывание веб-проекта в обычный рабочий процесс без выхода из IDE.

9.1. Встраивание Jetty в Eclipse

Мы можем встроить установку Jetty в eclipse, выбрав элемент окна на панели задач, а затем настройки в раскрывающемся меню.

Мы найдем древовидную сетку элементов предпочтений на левой панели появившегося окна. Затем мы можем перейти к eclipse -\u003e серверы или просто ввести серверы в строке поиска.

Затем мы выбираем каталог Jetty, если он еще не открыт для нас, и выбираем загруженную версию Jetty.

В правой части панели появится страница конфигурации, где мы выбираем параметр включения, чтобы активировать эту версию Jetty, и переходим к папке установки.

Судя по снимкам экрана, jetty 7.x будет заменен на настроенную нами версию jetty.

Мы применяем изменения, и в следующий раз, когда мы откроем представление серверов из окон eclipse -\u003e подменю show view, будет присутствовать вновь настроенный сервер, и мы сможем запускать, останавливать и развертывать приложения на нем.

9.2. Развертывание веб-приложения во встроенном Jetty

Чтобы развернуть веб-приложение во встроенном экземпляре Jetty, оно должно существовать в нашей рабочей области.

Откройте вид серверов из окна -\u003e показать вид и найти серверы. При открытии мы можем просто щелкнуть правой кнопкой мыши на настроенном нами сервере и выбрать «Добавить развертывание» в появившемся контекстном меню.

В появившемся диалоговом окне New Deployment откройте раскрывающийся список проекта и выберите веб-проект.

Под полем со списком «Проект» есть раздел «Тип развертывания», когда мы выбираем «Разнесенный архив» (режим разработки), наши изменения в приложении будут синхронизироваться в реальном времени без необходимости повторного развертывания, это лучший вариант во время разработки, поскольку он очень эффективен. .

Выбор Packaged Archive (рабочий режим) потребует повторного развертывания каждый раз, когда мы вносим изменения и видим их в браузере. Это лучше всего только для продакшена, но Eclipse делает это одинаково легко.

9.3. Развертывание веб-приложения во внешнем расположении

Обычно мы выбираем развертывание WAR через Eclipse, чтобы упростить отладку. Может наступить время, когда мы захотим развернуть его в месте, отличном от того, которое используется встроенными серверами Eclipse.

Наиболее распространенный случай, когда наш рабочий сервер подключен к сети, и мы хотим обновить веб-приложение.

Мы можем обойти эту процедуру, развернув в производственном режиме и отметив место развертывания в диалоговом окне «Новое развертывание» и выбрав WAR оттуда.

Во время развертывания вместо выбора встроенного сервера мы можем выбрать параметр \u003cExternally Launched\u003e в представлении серверов рядом со списком встроенных серверов. Мы переходим в каталог $JETTY_HOME/webapps внешней установки Jetty.

10. Развертывание из IntelliJ IDEA

Чтобы развернуть веб-приложение на Jetty, оно должно существовать, быть загруженным и установленным.

«10.1. Локальная конфигурация

Откройте меню «Выполнить» и щелкните параметры «Редактировать конфигурации».

В панели слева найдите Jetty Server, если его там нет, нажмите значок + в меню, найдите Jetty и выберите Local. В поле имени введите Jetty 9.

Нажмите кнопку «Настроить…» и в поле Jetty Home перейдите к домашнему местоположению вашей установки и выберите его.

При необходимости установите стартовую страницу http://localhost:8080/ и HTTP-порт: 8080, измените порт соответствующим образом.

Перейдите на вкладку Deployment и нажмите на символ +, выберите артефакт, который хотите добавить на сервер, и нажмите OK

10.2. Удаленная конфигурация

Следуйте тем же инструкциям, что и для локальной конфигурации Jetty, но на вкладке сервера вы должны ввести удаленное расположение установки.

11. Заключение

В этой статье мы подробно рассмотрели различные способы развертывания файла WAR на веб-сервере Jetty.

«