1. Обзор
В этой статье мы сделаем краткий обзор веб-сервера Jetty, а затем рассмотрим различные подходы к развертыванию файла WAR.
Jetty — это веб-сервер Java HTTP с открытым исходным кодом и контейнер сервлетов. Jetty чаще используется для межмашинного взаимодействия в экосистеме Java.
2. Настройка проекта
Последнюю версию Jetty всегда можно скачать по этой ссылке . Мы создадим очень простое веб-приложение Java из командной строки с помощью Maven, которое мы будем использовать в наших примерах.
В этой статье мы используем Jetty 9.x, последнюю версию на данный момент.
Давайте перейдем к нашей консоли, перейдем к выбранному нами местоположению и выполним следующую команду:
mvn archetype:generate -DgroupId=com.foreach -DartifactId=jetty-app
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Эта команда создаст полное веб-приложение Java в новой папке jetty-app
в нашем текущем местоположении. Это всего лишь один из многих способов создания Java-приложения с помощью Maven, и он подходит для нашей цели.
Поскольку мы будем иметь дело с файлами WAR, давайте перейдем к корню проекта и соберем его:
cd jetty-app
Сборка с Maven:
mvn package
Затем в папке jetty -app/target/jetty
-app.war
будет создан файл 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
, который мы только что развернули, удалив его из webapps
. Затем мы создадим 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. Изменение контекстного пути
Из предыдущего подраздела приложение было развернуто в /
context. Однако, если мы хотим выполнить развертывание по заданному пути контекста, такому как /jetty
, как раньше, нам придется настроить плагин по-другому.
Мы изменим объявление нашего плагина на следующий XML:
<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>
Обратите внимание, как мы добавили блок конфигурации для дальнейшей настройки нашего развертывания. Существует несколько вариантов конфигурации, которые можно разместить внутри этого блока в зависимости от того, что вы хотите.
После этих изменений мы можем повторно запустить плагин, как и раньше, и получить доступ к нашему приложению через http://localhost:8080/jetty
.
6.3. Изменение порта
Сценарий, с которым можно столкнуться, — это исключение использования порта. Может быть, у нас есть экземпляр причала, работающий на порту 8080
для производства, но мы все еще находимся на этапе разработки и хотим извлечь выгоду из простоты итерации, связанной с развертыванием с помощью подключаемого модуля Maven.
В таких случаях мы должны запустить наш тестовый сервер на другом порту. Давайте изменим конфигурацию плагина на следующий XML:
<configuration>
<webApp>
<contextPath>/jetty</contextPath>
</webApp>
<httpConnector>
<port>8888</port>
</httpConnector>
</configuration>
Когда мы повторно запустим наш плагин 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. Базовое развертывание
Давайте развернем нашу WAR с помощью jetty-runner:
java -jar jetty-runner-9.4.0.M1.jar jetty-app/target/jetty-app.war
Эта команда, как и в случае с плагином Maven, создает экземпляр причала и развертывает на нем предоставленный файл WAR. Путь WAR может быть абсолютным или относительным путем.
Мы можем загрузить это приложение, используя http://localhost:8080
.
7.3. Развертывание с контекстным путем
Чтобы развернуть в контексте /jetty
, как и раньше:
java -jar jetty-runner-9.4.0.M1.jar --path /jetty jetty-app/target/jetty-app.war
Доступен через 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
Чтобы развернуть несколько WAR с помощью одной и той же команды, мы используем аргумент –path
, чтобы сделать каждый из них уникальным:
java -jar jetty-runner --path /one one.war --path /two two.war
Затем мы получили бы доступ к one.war
через http://localhost:8080/one
и к two.war
через http://localhost:8080/two
.
8. Развертывание с помощью плагина Cargo Maven
Cargo — это универсальная библиотека, которая позволяет нам стандартно манипулировать различными типами контейнеров приложений.
8.1. Настройка развертывания груза
В этом разделе мы рассмотрим, как использовать плагин Cargo Maven для развертывания WAR на Jetty , в данном случае мы будем развертывать WAR на экземпляре Jetty 9.x.
Чтобы получить четкое представление обо всем процессе, мы начнем с нуля, создав новое веб-приложение Java из командной строки:
mvn archetype:generate -DgroupId=com.foreach -DartifactId=cargo-deploy
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Это создаст полное веб-приложение Java в каталоге cargo-deploy .
Если мы создадим, развернем и загрузим это приложение как есть, оно напечатает Hello World!
в браузере.
Поскольку наше веб-приложение не содержит сервлетов, наш файл web.xml
будет очень простым. Итак, перейдите в папку WEB-INF
нашего недавно созданного проекта и создайте файл web.xml
, если он еще не был создан автоматически, со следующим содержимым:
<?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>
Чтобы Maven мог распознавать команды cargo без ввода полного имени, нам нужно добавить плагин Cargo Maven в группу плагинов в файле settings.xml Maven.
В качестве непосредственного дочернего элемента корневого элемента <settings></settings>
добавьте следующее:
<pluginGroups>
<pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>
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-адрес этой установки.
Установив тип конфигурации в exists
, мы сообщаем 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
.
Соображения безопасности
Мы должны настроить область безопасности в причале, прежде чем это заработает, для целей аутентификации. Создайте файл с именем realm.properties
в каталоге $JETTY_HOME/etc
удаленного сервера причала. Содержимое файла:
admin:password,manager
Администратор —
это имя пользователя, под которым клиент может получить доступ к защищенным приложениям, пароль
— это пароль, а менеджер
— это роль, которой должны обладать клиенты, прежде чем им будет предоставлен доступ.
Мы также должны объявить наши требования безопасности в приложении развертывания. Мы распакуем файл WAR, который мы скачали со страницы загрузок пристани, внесем некоторые изменения и запакуем его обратно в файл WAR.
После распаковки перейдите к WEB-INF/web.xml
и раскомментируйте XML-код с помощью Uncomment, чтобы активировать
комментарий безопасности. Или поместите туда следующий код:
<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>
Развертывание деплойера
Теперь мы можем упаковать приложение обратно в WAR и скопировать его в любое место на удаленном сервере. Затем мы развернем его на Jetty.
Во время развертывания лучше всего использовать файл дескриптора развертывания, чтобы мы могли создать securityHandler
и передать ему loginService
. Все защищенные приложения должны иметь службу входа в систему, иначе Jetty не сможет их развернуть.
Теперь давайте создадим файл контекста в $JETTY_HOME/webapps
удаленного экземпляра причала, запомните правила именования файла контекста. Сделайте его таким же именем, как WAR:
<?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>
Запустите удаленный сервер причала, и если все пойдет хорошо, мы сможем загрузить http://localhost:8080/cargo-jetty-deployer.
Затем мы должны увидеть что-то вроде:
HTTP ERROR 400
Problem accessing /cargo-jetty-deployer/. Reason:
Command / is unknown
Развертывание WAR на удаленном причале
Чтобы выполнить удаленное развертывание, нам нужно всего лишь изменить раздел конфигурации pom.xml
. Удаленное развертывание означает, что у нас нет локальной установки Jetty, но есть аутентифицированный доступ к приложению развертывания, работающему на удаленном сервере.
Итак, давайте изменим pom.xml
, чтобы раздел конфигурации выглядел так:
<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>
На этот раз мы меняем тип контейнера с установленного
на удаленный
и тип конфигурации с существующего
на время выполнения
. Наконец, мы добавляем в конфигурацию имя хоста, порт и свойства аутентификации.
очистить проект:
mvn clean
установить его:
mvn install
наконец, разверните его:
mvn cargo:deploy
Вот и все.
9. Развертывание из Eclipse
Eclipse позволяет нам встраивать серверы, чтобы добавить развертывание веб-проекта в обычный рабочий процесс, не покидая IDE.
9.1. Встраивание Jetty в Eclipse
Мы можем встроить установку Jetty в eclipse, выбрав элемент окна
на панели задач, а затем настройки
в раскрывающемся меню.
Мы найдем древовидную сетку элементов предпочтений на левой панели появившегося окна. Затем мы можем перейти к eclipse -> серверы или просто ввести серверы в строке поиска.
Затем мы выбираем каталог Jetty, если он еще не открыт для нас, и выбираем загруженную версию Jetty.
В правой части панели появится страница конфигурации, где мы выбираем параметр включения, чтобы активировать эту версию Jetty, и переходим к папке установки.
Судя по снимкам экрана, причал 7.x будет заменен версией причала, которую мы настроили.
Мы применяем изменения, и в следующий раз, когда мы откроем представление серверов из окон eclipse -> показать подменю представления, будет присутствовать вновь настроенный сервер, и мы сможем запускать, останавливать и развертывать на нем приложения.
9.2. Развертывание веб-приложения во встроенном Jetty
Чтобы развернуть веб-приложение во встроенном экземпляре Jetty, оно должно существовать в нашей рабочей области.
Откройте представление серверов
из окна -> показать представление и найти серверы. При открытии мы можем просто щелкнуть правой кнопкой мыши на настроенном нами сервере и выбрать « Добавить развертывание
» в появившемся контекстном меню.
В появившемся диалоговом окне « Новое развертывание » откройте раскрывающийся список
проектов
и выберите веб-проект.
Под полем со списком « Проект»
есть раздел « Тип развертывания », когда мы выбираем «
Разнесенный архив» (режим разработки)
, наши изменения в приложении будут синхронизироваться в реальном времени без необходимости повторного развертывания , это лучший вариант во время разработки, поскольку он очень эффективен.
****
Выбор Packaged Archive (рабочий режим)
потребует повторного развертывания каждый раз, когда мы вносим изменения и видим их в браузере. Это лучше всего только для продакшена, но Eclipse делает это одинаково легко.
9.3. Развертывание веб-приложения во внешнем расположении
Обычно мы выбираем развертывание WAR через Eclipse, чтобы упростить отладку. Может наступить время, когда мы захотим развернуть его в месте, отличном от того, которое используется встроенными серверами Eclipse.
Наиболее распространен случай, когда наш рабочий сервер подключен к сети, и мы хотим обновить веб-приложение.
Мы можем обойти эту процедуру, развернув в производственном режиме и отметив место развертывания
в диалоговом окне « Новое развертывание
» и выбрав WAR оттуда.
Во время развертывания вместо выбора встроенного сервера мы можем выбрать параметр <Externally Launched>
в представлении серверов
рядом со списком встроенных серверов. Мы переходим в каталог $JETTY_HOME
/ webapps
внешней установки Jetty.
10. Развертывание из IntelliJ IDEA
Чтобы развернуть веб-приложение на Jetty, оно должно существовать и уже быть загруженным и установленным.
10.1. Локальная конфигурация
Откройте меню « Выполнить»
и щелкните параметры « Редактировать конфигурации
» .
В панели слева найдите Jetty Server
, если его там нет, нажмите знак + в меню, найдите Jetty
и выберите Local
. В поле имени
введите Jetty 9
.
Нажмите кнопку « Настроить…
» и в поле « Jetty Home»
перейдите к домашнему местоположению вашей установки и выберите его.
При необходимости установите стартовую
страницу http://localhost:8080/
и HTTP-порт: 8080
, измените порт соответствующим образом.
Перейдите на вкладку « Развертывание
» и нажмите на символ «+», выберите артефакт, который хотите добавить на сервер, и нажмите «ОК».
10.2. Удаленная конфигурация
Следуйте тем же инструкциям, что и для локальных конфигураций Jetty, но на вкладке сервера вы должны ввести удаленное расположение установки.
11. Заключение
В этой статье мы подробно рассмотрели различные способы развертывания файла WAR на веб-сервере Jetty.