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

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

1. обзор

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

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

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

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

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

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

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

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

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

cd jetty-app

Здание с Maven:

mvn package

Затемjetty-app.war будет создан в местоположенииjetty-app/target/jetty-app.war.

3. Структура пристани

Context path. Относится к расположению, которое относится к адресу сервера и представляет имя веб-приложения.

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

WAR. Расширение файла, который упаковывает иерархию каталогов веб-приложения в формате 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.

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

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

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

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

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




    /jetty
    absolute/path/to/jetty-app.war

This context file must have the same name as our WAR с расширением файла XML. Обратите внимание, что мы установили атрибутcontextPath на/jetty. Это означает, что мы будем обращаться к нашему веб-приложению по URL-адресуhttp://localhost:8080/jetty.

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

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

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

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


    org.eclipse.jetty
    jetty-maven-plugin
    9.3.11.v20160721

Последнюю версию можно найти, набравthis Maven link.

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

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

mvn jetty:run

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

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

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

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

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


    org.eclipse.jetty
    jetty-maven-plugin
    9.3.11.v20160721
    
        
            /jetty
        
    

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

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

6.3. Смена порта

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

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


    
        /jetty
    
    
        8888
    

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

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

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

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

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

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

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

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

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

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

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

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

Эта команда, как и в случае с плагином Maven, создает экземпляр Jetty и развертывает на нем предоставленную 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

В этом разделе мы рассмотрим, какuse Cargo’s Maven plugin to deploy a WAR to Jetty, в этом случае мы развернем WAR на экземпляре Jetty 9.x.

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

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

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

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




    cargo-deploy
    
        index.jsp
    

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

Как непосредственный дочерний элемент корневого элемента<settings></settings>, добавьте это:


    org.codehaus.cargo

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

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

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


    
        
            org.codehaus.cargo
            cargo-maven2-plugin
            1.5.0
            
                
                    jetty9x
                    installed
                    Insert absolute path to jetty 9 installation
                
                
                    existing
                    Insert absolute path to jetty 9 installation
                
            
       
    

Обратите внимание, что мыexplicitly define the packaging as a WAR, без этого наша сборка не удастся. В разделе плагинов мы добавим плагин cargo maven2.

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

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

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

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

Стоит отметить, что независимо от того, используем ли мы 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 remote deployer.

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

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

Эту удаленную программу развертывания можно найтиhere. Перейдите в разделtools и загрузитеcargo-jetty-7-and-onwards-deployer WAR.

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

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

admin:password,manager

admin - это имя пользователя, под которым клиент может получить доступ к защищенным приложениям,password - это пароль, аmanager - это роль, которую клиенты должны иметь перед предоставлением доступа.

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

После распаковки перейдите кWEB-INF/web.xml и раскомментируйте XML-код комментариемUncomment in order to activate security. Или поместите следующий код:


    
        Jetty Remote Deployer
        /*
    
    
        manager
    



    BASIC
    Test Realm

Развертывание средства развертывания

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

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

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




    /deployer
    absolute/path/to/cargo-jetty-deployer.war
    
        
            
                Test Realm
                /etc/realm.properties
            
        
    

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

HTTP ERROR 400

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

    Command / is unknown

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

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

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


    
        jetty9x
        remote
    
    
        runtime
        
      127.0.0.1
            8080
            admin
            password
        
    

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

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

mvn clean

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

mvn install

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

mvn cargo:deploy

Это оно.

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

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

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

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

На левой панели появившегося окна мы найдем древовидную сетку элементов предпочтений. Затем мы можем перейти к eclipse → servers или просто ввести серверы в строку поиска.

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

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

Из скриншотов, Jetty 7.x будет заменен версией Jetty, которую мы настроили.

image

 

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

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

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

Откройте представлениеservers из окна → показать представление и найдите серверы. В открытом состоянии мы можем просто щелкнуть правой кнопкой мыши по настроенному нами серверу и выбратьadd deployment в появившемся контекстном меню.

image

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

Под полем со спискомProject есть разделDeploy Type, когда мы выбираемExploded Archive(development mode),our changes in the application will be synced live without having to redeploy, это лучший вариант во время разработки, поскольку он очень эффективен.

image

 

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

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

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

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

Мы можем обойти эту процедуру, развернув в производственном режиме, отметивDeploy Location в диалоговом окнеNew Deployment и выбрав оттуда WAR.

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

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

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

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

Откройте менюRun и щелкните параметрыEdit Configurations.

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

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

При желании установите для страницыStartup значениеhttp://localhost:8080/ иHTTP port: 8080, измените порт соответствующим образом.

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

10.2. Удаленная настройка

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

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

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