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

Как установить jetty в idea

  • автор:

Как добавить плагин jetty-runner в IntelliJ IDEA?

Author24 — интернет-сервис помощи студентам

Друзья! Я уже пас.
Короче, есть IntelliJ_IDEA и вот там такое окошоко, как на рисунке. И в этом окошке должна появляться запускалка контейнера сервлетов jetty. Запускалка называется jetty-runner или что-нибудь в этом духе. А воообще по фигу, где она будет находиться, лишь бы находилась и работала.

Собсно, ошибиться при установке плагина очень трудно. Действую так: Ctrl+ Alt+ S-> Plugins-> Browse repositories-> jetty-< Enter

Тут у меня нарисовывается красивый IDEA Jetty Runner, ага

Install Plugins-> Yes-> (тут жду , пока загрузится)-> Close-> IDEA Jetty Runner-> restart IntelliJ IDEA-> Exit

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

Встраиваем Jetty-сервер в свой проект

В этой статье я расскажу от такой крутой вещи, как Jetty сервер! Почему Jetty крутой и чем он может быть полезен сферическому java-программисту в вакууме? Всё дело в том что Jetty является одновременно легковесным и хорошо оптимизированным решением, которое можно использовать как в небольших, так и в крупных проектах. Jetty хорошо масштабируется, экономично использует память, но самый жир это то что его можно встроить в своё приложение. Это дико удобно когда нужно отладить работу веб-приложения, так как отпадает необходимость постоянно его пересобирать и заливать на сервер приложений. Да и вообще встроенный сервер может решать кучу полезных задач, например недавно мне понадобилось сделать легковесное веб-приложение со встроенным сервером, которое можно было бы запускать одной командой на любой машине, и для решения этой задачи я использовал Jetty.

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

  1. Наш проект будет собираться в jar-файл и запускаться простой командой java -jar. Все зависимости будут собираться в отдельную папку lib, которая будет лежать в одном каталоге с jar-файлом.
  2. Наш проект будет иметь внешний (не обязательный) файл настроек app.properties

Посвящать этим двум фишкам отдельную статью смысла нет, тем более что в данном примере они будут смотреться очень уместно. Теперь перейдём к разработке:

Для начала создайте веб-приложение в своей любимой IDE (я предпочитаю IDEA IntelliJ) или с помощью команды:

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

В результате этих манипуляций должен сгенерироваться проект вот с такой структурой:

Затем надо добавить в файл pom.xml все зависимости, которые будут нужны для дальнейшей работы. Для наглядности я решил прикрутить к проекту Spring MVC:

  org.springframework spring-webmvc $ org.springframework spring-core $ org.springframework spring-web $ 

Ну и конечно же зависимости для Jetty:

  org.eclipse.jetty jetty-server $ org.eclipse.jetty jetty-webapp $ org.eclipse.jetty jetty-jsp $ 

Версии зависимостей я вынес в отдельный блок для красоты:

  UTF-8 4.3.1.RELEASE 9.2.19.v20160908 

Кроме этого, нам потребуются три Maven-плагина, которые так же нужно добавить в pom.xml:

   maven-compiler-plugin 1.7 1.7   org.apache.maven.plugins maven-dependency-plugin  copy-dependencies prepare-package copy-dependencies  $/lib false false true     org.apache.maven.plugins maven-jar-plugin   true lib/ ru.kutepov.launcher.Launcher     

maven-compiler-plugin отвечает за версию Java, которая используется при сборке проекта.

maven-dependency-plugin собирает все зависимости в папку lib и помещает её в каталог рядом с jar-файлом.

maven-jar-plugin делает jar-файл запускаемым и указывает класс (в данном случае ru.kutepov.launcher.Launcher, его мы создадим чуть позже), который вызывается при запуске проекта. Так же данный плагин записывает в манифест ссылку на папку с библиотеками — lib, которая создана предыдущим плагином.

Ещё необходимо задать папку ресурсов и указать местоположение внешнего файла с настройками приложения:

   src/main/webapp  $/src/main/webapp/resources/properties app.properties  ..  

В итоге должен получиться вот такой pom.xml:

 4.0.0 ru.akutepov jetty-example jar 1.0 jetty-example UTF-8 4.3.1.RELEASE 9.2.19.v20160908    org.springframework spring-webmvc $ org.springframework spring-core $ org.springframework spring-web $  org.eclipse.jetty jetty-server $ org.eclipse.jetty jetty-webapp $ org.eclipse.jetty jetty-jsp $    src/main/webapp  $/src/main/webapp/resources/properties app.properties  ..   jetty-example  maven-compiler-plugin 1.7 1.7   org.apache.maven.plugins maven-dependency-plugin  copy-dependencies prepare-package copy-dependencies  $/lib false false true     org.apache.maven.plugins maven-jar-plugin   true lib/ ru.kutepov.launcher.Launcher        

С зависимостями разобрались, продолжаем дальше конфигурировать наше приложение. В папке /src/main/webapp/WEB-INF должен лежать файл web.xml. Если он ещё там не лежит, то его нужно немедленно создать:

 Jetty example mvc-dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/beans.xml  1  mvc-dispatcher /  

Файл web.xml определяет соответствие между путями URL и сервлетами, которые эти URL будут обрабатывать. Веб-сервер использует эту конфигурацию, чтобы определить сервлет для обработки данного запроса и вызвать метод класса, который соответствует методу запроса.

Обратите внимание что в init-param мы указали местоположение конфига для Spring, поэтому создайте файл beans.xml в папке /src/main/webapp/WEB-INF/ со следующим содержимым:

В property-placeholder я указал расположение внешнего файла конфига app.properties, затем с помощью component-scan инициализирую все классы из пакета ru.kutepov с аннотацией @Component. В конце инициализирую InternalResourceViewResolver, который отвечает за отображение .jsp страницы.

Теперь откройте файл index.jsp, который располагается в папке /src/main/webapp/WEB-INF/pages/ и вставьте туда такой код:

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

Создайте в папке /src/main/webapp/resources/properties/ файл app.properties и добавьте туда строку:

value=Have a nice day!

Затем создайте в папке /src/main/java пакет ru.kutepov.controller и добавьте в него класс MainController.java:

package ru.kutepov.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/") public class MainController < @Value("$") public String value; @RequestMapping(method = RequestMethod.GET) public String printWelcome(ModelMap model) < model.addAttribute("message", "Hello world!"); model.addAttribute("property_value", value); return "index"; >>

Тут тоже всё довольно просто: метод printWelcome обрабатывает все GET-запросы по адресу «/» и возвращает в ответ страницу html, которая генерируется на основе .jsp шаблона. В шаблон передаются 2 переменные message и property_value. В messageмы передаём произвольную строку а в property_value значение переменной value из файла app.properties.

Завершающим этапом будет создание загрузчика, который будет запускать jetty-сервер. добавьте в пакет ru.kutepov пакет launcher и создайте в нём класс Launcher.java:

package ru.kutepov.launcher; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; import java.net.URL; import java.security.ProtectionDomain; /** * Starts jetty-server on the specified port */ public class Launcher < public static void main(String[] args) throws Exception < int port = 12135; try < if (args.length >0) < port = Integer.parseInt(args[0]); >> catch (Exception e) < e.printStackTrace(); >Server server = new Server(port); ProtectionDomain domain = Launcher.class.getProtectionDomain(); URL location = domain.getCodeSource().getLocation(); WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); webapp.setWar(location.toExternalForm()); server.setHandler(webapp); server.start(); server.join(); > >

Данный загрузчик запускает jetty-сервер на порту 12135 по умолчанию, либо на том порту, который был передан в качестве аргумента командной строки. Рассмотрим код подробнее:

В начале переменной port присваиваем номер порта по умолчанию — 12135, затем проверяем был ли передан номер порта в качестве аргумента командной строки. Если в args[0] находим номер порта, то записываем его в переменною port. Это позволит запускать приложение на любом порту, и у нас всегда будет значение по умолчанию — очень удобно!

Далее создаём класс сервера (Server) и передаём этого ему номер порта.

Затем нужно проинициализировать контекст веб-приложения — WebAppContext. Для этого объекту WebAppContext необходимо передать путь строки запроса, который будет обрабатывать веб-приложение, а так же указать расположение папки проекта с исходным кодом. Со строкой запроса всё понятно: я просто передаю путь «/» в метод setContextPath. А вот с исходным кодом немного сложнее:

В начале я получаю объект класса ProtectionDomain, который содержит в себе все характеристики домена. У ProtectionDomain есть замечательный метод getCodeSource(), который возвращает объект класса CodeSource. Класс CodeSource содержит в себе информацию о расположении ресурса (URL ресурса или ссылка на локальный ресурс), а так же информацию о цепочки сертификатов, которые использовались, чтобы проверить подписанный код, происходящий из того расположения. Чтобы получить информацию о расположении ресурсов, я вызываю метод getLocation() объекта класса CodeSource и получаю объект URL, который как раз содержит то что нужно. Так как в WebAppContext необходимо передать путь в виде строки, вызываем метод toExternalForm() объекта класса URL и передаём полученную строку в метод setWar() объекта класса WebAppContext.

В конце передаём готовый объект класса WebAppContext в метод setHandler()объекта класса Server и запускаем наш сервер.

Всё, приложение готово! Соберите проект командой:

mvn clean install

Перейдите в сгенерированный каталог /target и выполните команду:

java -jar jetty-example.jar

или если хотите запустить приложение ну другом порту, то команду:

java -jar jetty-example.jar 8800

Откройте в браузере ссылку http://localhost:12135/ или http://localhost:8800/, если ввели вторую команду. Вы должны увидеть такую страницу:

Есть и альтернативный способ запуска приложения, который особенно удобно использовать во время отладки — запуск из IDE. В IntelliJ IDEA достаточно открыть Launcher.java, нажать правую кнопку мыши и выбрать пункт Run ‘Launcher.main()’. Как такой трюк повторить в других IDE разбирайтесь сами 🙂

Как запустить Jetty в Idea 2017.3.3?

Прохожу уроки по Intuit mailru урокам. В курсе запланировано создание игрового приложения, все уроки проводятся в IDE отличной от моей, после прохождения основ представлено первое задание самостоятельной работы — запустить Jetty без подсказок. Самостоятельно разобраться не смог. Подскажите, пожалуйста, по-шагово как прикрутить Jetty в Inteliji IDEA.
Примечание: имею опыт по запуску контейнера сервлетов, знания находятся на уровне: «могу запустить Tomcat и дальше не умею.

  • Вопрос задан более трёх лет назад
  • 731 просмотр

1 комментарий

Оценить 1 комментарий

Как запустить свое веб-приложение на Jetty в IntelliJ Idea

Здравствуйте! Я разрабатываю Spring MVC веб-приложение и мне нужно чтобы оно работало на Jetty-сервере, не требующем внешнего контейнера. Я добавил сервер jetty стандартным образом через «edit run configuration». введите сюда описание изображения
Он также успешно отображается в Project Structure. введите сюда описание изображения Но, когда я запускаю Jetty то он просто не запускается и выдает мне следущее:

"C:\Program Files\Java\jdk1.8.0_65\bin\java" -DSTOP.PORT=0 -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -DOPTIONS=jmx -Didea.launcher.port=7535 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\bin" -Dfile.encoding=windows-1251 -classpath "D:\jetty-distribution-9.3.7.v20160115\start.jar;C:\Program Files\Java\jdk1.8.0_65\lib\tools.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain org.eclipse.jetty.start.Main --module=jmx C:\Windows\Temp\context4config\jetty-contexts.xml [2016-03-03 07:17:55,511] Artifact DVDExchange:war exploded: Server is not connected. Deploy is not available. Detected server http port: 8080 java.nio.file.AccessDeniedException: C:\Windows\Temp\context4config\jetty-contexts.xml at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:90) at sun.nio.fs.WindowsLinkSupport.getRealPath(WindowsLinkSupport.java:259) at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:836) at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:44) at org.eclipse.jetty.start.FS.toRealPath(FS.java:165) at org.eclipse.jetty.start.StartArgs.addUniqueXmlFile(StartArgs.java:217) at org.eclipse.jetty.start.StartArgs.resolveExtraXmls(StartArgs.java:1123) at org.eclipse.jetty.start.Main.processCommandLine(Main.java:342) at org.eclipse.jetty.start.Main.main(Main.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Usage: java -jar start.jar [options] [properties] [configs] java -jar start.jar --help # for more information Disconnected from server Process finished with exit code -9 

Возможно, одна из причин — это пустой файл jetty-web.xml

введите сюда описание изображения

Как мне все-таки застваить Jetty работать? Приведите пожалуйста весь список файлов что нужно описать, а еще лучше поделитесь живым примером (туториалом или исходником), где четко все описано что и зачем. Мне очень срочно нужно разобраться с этим jetty.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *