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

Развертывание веб-приложений в Jetty

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

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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

./edcd58caf100ae57f8077946524864a2.png

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

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

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

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

./597a81178e8c13c4313338274159de1d.png

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

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

./0a7377e5668eb63a662079dfac759868.png

Выбор 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.