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

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

  • автор:

Intellij IDEA не видит org.eclipse.jetty*

не ресолвится. Просить открыть на проксе что конкретно? Я не могу обьяснить админу, чего не хватает. Помогите советом!

achechet
01.09.17 16:32:17 MSK

Я, бы посоветовал использовать Leafpad, там нет таких проблемм.

anonymous
( 01.09.17 16:55:39 MSK )

А с консоли-то находит? Если это у тебя mvn или что другое

dave ★★★★★
( 01.09.17 16:57:02 MSK )

либо клади в lib, либо используй Maven

bvn13 ★★★★★
( 01.09.17 16:58:32 MSK )

Откуда не подхватывает? Gradle? Maven?

xcariba ★★
( 01.09.17 16:58:56 MSK )

Опыта у меня маловато, я разбираю курс по программированию веб сервисов и уходить в сторону от идеи не получиться. Если я ручками качаю и в либ кладу и потом в проджект сеттингах добавляю то так получится. Но хочется чтоб идея занялась этим вопросом, да и не все библиотеки понятно откуда качать.

Как запустить свое веб-приложение на 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.

Встраиваем 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 разбирайтесь сами 🙂

Как правильно использовать Attach to process в intellij idea?

6023ae92b36f0688800873.png

Есть проект сервлета, который я запускаю на отладку через jetty.
Есть проект плагина в виде jar. Плагин (класс) загружается через URLClassLoader в сервлете и принимает вызовы из сервлета.
Я хотел бы ловить точки останова в проекте плагина.
Для этого из проекта плагина я подключаюсь через Attach to process к процессу сервлета и выбираю процесс:

При этом в variables я вижу сообщение
Target VM is not paused by breakpoint request. Evaluation of methods is not possible in this mode

При вызове методов плагина из сервлета, в проекте плагина я не ловлю точки останова.

Что я делаю не правильно?

  • Вопрос задан более двух лет назад
  • 113 просмотров

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

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