не ресолвится. Просить открыть на проксе что конкретно? Я не могу обьяснить админу, чего не хватает. Помогите советом!
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 сервер в своё приложение. Кроме этого, добавлю ещё пару интересных и полезных фишек:
Наш проект будет собираться в jar-файл и запускаться простой командой java -jar. Все зависимости будут собираться в отдельную папку lib, которая будет лежать в одном каталоге с jar-файлом.
Наш проект будет иметь внешний (не обязательный) файл настроек app.properties
Посвящать этим двум фишкам отдельную статью смысла нет, тем более что в данном примере они будут смотреться очень уместно. Теперь перейдём к разработке:
Для начала создайте веб-приложение в своей любимой IDE (я предпочитаю IDEA IntelliJ) или с помощью команды:
В результате этих манипуляций должен сгенерироваться проект вот с такой структурой:
Затем надо добавить в файл pom.xml все зависимости, которые будут нужны для дальнейшей работы. Для наглядности я решил прикрутить к проекту Spring MVC:
maven-compiler-plugin отвечает за версию Java, которая используется при сборке проекта.
maven-dependency-plugin собирает все зависимости в папку lib и помещает её в каталог рядом с jar-файлом.
maven-jar-plugin делает jar-файл запускаемым и указывает класс (в данном случае ru.kutepov.launcher.Launcher, его мы создадим чуть позже), который вызывается при запуске проекта. Так же данный плагин записывает в манифест ссылку на папку с библиотеками — lib, которая создана предыдущим плагином.
Ещё необходимо задать папку ресурсов и указать местоположение внешнего файла с настройками приложения:
С зависимостями разобрались, продолжаем дальше конфигурировать наше приложение. В папке /src/main/webapp/WEB-INF должен лежать файл web.xml. Если он ещё там не лежит, то его нужно немедленно создать:
Файл 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?
Есть проект сервлета, который я запускаю на отладку через jetty. Есть проект плагина в виде jar. Плагин (класс) загружается через URLClassLoader в сервлете и принимает вызовы из сервлета. Я хотел бы ловить точки останова в проекте плагина. Для этого из проекта плагина я подключаюсь через Attach to process к процессу сервлета и выбираю процесс:
При этом в variables я вижу сообщение Target VM is not paused by breakpoint request. Evaluation of methods is not possible in this mode
При вызове методов плагина из сервлета, в проекте плагина я не ловлю точки останова.