Деплой веб-приложения на Tomcat в IntelliJ IDEA Community Edition

English version 

Это краткое руководство поможет начинающим разработчикам Java EE.

IntelliJ IDEA - отличная IDE для Java, однако ее бесплатная версия Community Edition несколько ограничена в разработке веб-приложений и Java EE в целом. В Community версии очень легко разрабатывать desktop приложения, но как только становится необходимо разработать веб-приложение с Java EE, ты вдруг обнаруживаешь, что в Community нет никакой поддержки ни апп серверов (JBoss, GlassFish), ни даже сервлет контейнеров (Tomcat).

В этом руководстве я покажу, как обойти эту проблему (без установки довольно дорогой или крякнутой Ultimate Edition) путем интеграции IntelliJ IDEA Community Edition с Tomcat (через Maven) для разработки веб-приложений с сервлетами.
Начнем с того, что создадим наш проект, щелкнув на пункте New -> Project в верхнем меню.
В левой части выбираем Maven, а в правой архетип maven-archetype-webapp (рис. 1):

Рис. 1. Создайте проект Maven.

На следующих скриншотах видно, как задавать group id, artifact id, имя проекта и папку для него. Group id - уникальный идентификатор твоего проекта, обычно это имя java пакета в соответствии с Java code conventions. Artifact id  - имя JAR файла который заносится в репозиторий Maven, в данном случае mywebapp. Здесь можно подробнее почитать как выбрать group id и artifact id.


После того как проект создан, появится стандартная структура папок необходимая для веб-приложения: папка WEB-INF, файл web.xml и даже главная страница(рис. 2).

Рис. 2. Стандартная структура папок.
 
 Maven уже сможет собрать такой проект, но до сих пор некуда класть исходный код Java! Это нам и надо исправить (рис. 3). Создаем папку java по адресу My web app/src/main/ и метим ее как "source root". В этой папке хранится код сервлетов.

Рис. 3. Создаем папку для исходников.

Создадим для примера сервлет HelloServlet.java (рис. 4) и вставляем туда следующий код:



Рис. 4. Создаем сервлет.

Код правильный, но почему он подчеркивается красным как ошибка? Надо добавить библиотеки Java EE при помощи Maven. Открываем pom.xml и приводим его к такому виду:



Изменения в pom.xml.

Хотя это и не требуется для того чтобы собрать проект, мы также добавили в pom.xml директивы которые вытягивают с серверов Maven плагин tomcat7-maven. Теперь воспользуемся этим плагином: создаем новую Run/Debug Configuration типа Maven, называем ее как угодно, в поле Command line пишем tomcat7:run, и наконец добавляем clean в список целей Maven перед запуском (рис. 5):

Рис. 5. Создаем конфигурацию запуска.

Поздравляю! Теперь у тебя есть рабочее веб-приложение Java EE с конфигурацией запуска которая его собирает, делает WAR архив и деплоит его в Tomcat:


Теперь можно просто нажать Shift+F10 (или кнопку Run на панели вверху) и увидеть в браузере страницу index.jsp по адресу http://localhost:8888 (ссылка будет в окне вывода информации о сборке):


JSP есть, а что насчет сервлетов? Чтобы обратиться к сервлету, надо дать Tomcat понять, где его искать и на какой адрес замапить. Для этого поменяем 2 файла: src/main/webapp/WEB_INF/web.xml и src/main/webapp/index.jsp :





Изменения в web.xml и index.jsp.

Снова запускаем проект и вуаля! Теперь из главной страницы можно перейти к сервлету и убедиться что он работает:


Теперь твоя скромная IntelliJ IDEA Community Edition стала на шаг ближе к полной версии - она автоматически собирает проект, делает WAR архив и деплоит его в Tomcat.

Скачать готовый проект IntelliJ IDEA

Как автоматически запускать браузер после деплоя

Это продолжение статьи предназначается для тех людей, которым недостаточно автоматизации в приведенном решении деплоя и теста веб приложений. "Ну да, я жму Run и запускается Tomcat но после этого надо самому жать ссылку и чистить кеш браузера?" Давайте исправим это и сделаем так, чтобы при запуске приложения оно открывалось в браузере:
  1. Заменяем текст между тегами <plugins> </plugins> в pom.xml:



  2. Идем в Run/Debug Configurations и меняем параметр Command line на verify :


  3. Создаем файл test.bat в корне проекта с таким содержимым:

N.B. Для того чтобы не чистить кеш после каждого запуска я заменил запуск стандартного браузера на Chrome в режиме инкогнито:
Если не чистить кеш в обычном режиме браузера, он будет хранить старые версии скриптов которые ты подключаешь в страницах, что может привести ко многим часам чесания головы.
Вот и все! Можно запускать проект и после деплоя он откроется в браузере:


Чтобы выключить Tomcat можно либо нажать Ввод в окне "Run" (правильный способ) или нажать кнопку "Стоп" на верхней панели (экстренное завершение).


Comments

  1. Огромное спасибо! Простой и главное работающий пример для простого приложения, легко ставится и юзается!

    ReplyDelete
    Replies
    1. Спасибо :) Написал статью как раз потому что сам перепробовал кучу нерабочих способов из Интернета.

      Delete
  2. Спасибо! Статья очень помогла!

    ReplyDelete
  3. Спасибо большое!

    ReplyDelete
  4. спасибо огромное! Вы очень подробно описали порядок действий, очень полезно для новичка - сразу все получилось)

    ReplyDelete
  5. Спасибо, парень, ты крутой)

    ReplyDelete
  6. сен 11, 2017 7:50:36 PM org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.47
    сен 11, 2017 7:50:43 PM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler ["http-bio-8080"]

    Дальше ничего не происходит. Помогите, пожалуйста

    ReplyDelete
  7. Автору самого лучшего пива!

    ReplyDelete
  8. Автору большое спасибо, наконец гайд который работает!

    ReplyDelete
  9. Большое спасибо за подробное разжевывание!
    Но есть проблема, может сможете обяснить в чем дело.
    После запуска приложения получаю в Intellij Idea:
    /home/lilija/IdeaProjects/My web app/test.bat: 1: /home/lilija/IdeaProjects/My web app/test.bat: @echo: not found
    /home/lilija/IdeaProjects/My web app/test.bat: 2: /home/lilija/IdeaProjects/My web app/test.bat: start: not found
    /home/lilija/IdeaProjects/My web app/test.bat: 3: /home/lilija/IdeaProjects/My web app/test.bat: pause: not found
    [ERROR] Command execution failed.

    ReplyDelete
    Replies
    1. Так как эти команды валидны для cmd в любой версии Windows (например https://www.computerhope.com/starthlp.htm), могу предложить только попробовать пересохранить .bat файл в ASCII кодировке.

      Delete
    2. Судя по путям у Вас не Windows, а одна из unix/unix-like систем, поэтому .bat скрипты работать и не должны. Совет от Вадима выше вызывают лишь грусть.

      Вам необходимо заменить test.bat на test.sh, выполнить "chmod +x /путь/до/sh/файла/test.sh", а в test.sh написать что-то вроде (пишу по памяти, так что-то сходу может не заработать):

      #!/bin/bash
      x-www-browser http://localhost:8888
      read -rsp $'Press any key to continue...\n' -n 1 key

      Надеюсь мой совет Вам поможет. Удачи в Вашей работе. И повышайте квалификацию по использованию того инструмента, что у Вас в руках. Разбираться в unix-like системах не зазорно.

      Delete
  10. Запускаю приложение на tomcat, открывается домашняя страница tomcat, а не index.jsp. С чем это может быть связано?

    ReplyDelete
  11. Автор, кто бы ты ни был, но ты мой герой! сутки возился, не мог понять как завести пример из лабораторки. а тут всё по полочкам))
    можешь ещё, пожалуйста, подсказать как порт, по которому контейнер сервлетов Tomcat слушает запросы?

    ReplyDelete
    Replies
    1. Спасибо, сам собирал этот способ по кускам из разных советов в интернете.
      Не совсем понял вопрос про порт - но если ты имеешь в виду как его переопределить с дефолтного то вот https://stackoverflow.com/questions/21083170/spring-boot-how-to-configure-port

      Delete
    2. Спасибо)
      я в итоге сделал так, тоже работает:
      В файле pom.xml заменил порт тут:

      8888
      /
      true

      Delete
    3. Thanks a lot, man. I really appreciate your work. This detailed tutorial was made with the teaching spirit. That's the point.
      Короче, пасиб, дико помог)
      Правда без сборщика я так и продолжаю кушать проблемы.
      Без сборщика я не смог сделать работающий кастом .
      Без мейвена просто открывается стандартная 404 (вместо кастомной).
      Со сборщиком же всё пашет на ура.
      Всё равно спасибо.

      Delete
  12. >>Открываем pom.xml и приводим его к такому виду
    Вот в этом месте я застрял, после "приведения к виду" запуск выдает ошибки.
    Просто скопировать не сработало, оставить как было и добавить кусок с плагином tomcat7 тоже не сработало.

    В сгенеренном pom.xml есть блок

    org.mortbay.jetty
    maven-jetty-plugin
    6.1.7



    8888
    30000


    ${project.build.directory}/${pom.artifactId}-${pom.version}
    /


    Надо ли его удалить?

    Основы java я изучил, но что такое maven и формат pom.xml - пока не знаю.
    Должно ли было у меня получится?
    Очень хочется сделать работающее веб приложение, но как это сделать вообще пока не понятно.
    Надо изучать maven и формат pom.xml?

    ReplyDelete
    Replies
    1. >Надо изучать maven и формат pom.xml?
      Определенно надо.
      Не понял часть описания про сгенерированный pom, но jetty я определенно не использую - вместо него tomcat.

      Delete
  13. Приветствую. Я делал всё точно по гайду, при этом у меня версия идеи IntelliJ IDEA 2018.2.5 (Community Edition). До момента с автоматическим запуском браузера были отличии, но всё работало. В частности, в блоке plugins было несколько других плагинов: maven-clean-plugin, maven-resources-plugin, и еще пару. Но я их убрал, и ничего не сломалось) Когда я попытался реализовать автозапуск, на том моменте, когда должен запускаться tomcat ( >>> tomcat7-maven-plugin:2.2:run) у меня (BUILD SUCCESS) и всё завершается. При этом ваш проект с автозапуском открывается нормально. Вот мой проект https://drive.google.com/drive/folders/1bEtng9ORt8MMb-KFBjZdh5uE-22ccxrp?usp=sharing

    ReplyDelete
    Replies
    1. UPD: оказалось, проблема была в тегах

      Delete
    2. Та же ситуация, не подскажете, как решили проблему ?

      Delete
    3. Пришлось помучиться, почему-то pom.xml не работает при автоматическом запуске браузера, если все плагины находятся внутри тега

      Delete
  14. Отлично, все работает, большое спасибо автору!

    ReplyDelete
  15. Идея ругается на то, что в pom.xml в открывающемся теге "i"написано в lower case, а в закрывающемся "i"написано в upper case. Тоже самое с Из-за этого не производится импорт вспомогательных jar файлов. Поправьте пожалуйста.

    junit
    junit

    javax
    javaee-api

    ReplyDelete
    Replies
    1. Ха, вижу. Это странность редактора блоггера - если редактируешь пост в графическом режиме то он уродует теги. Видимо, какая-то попытка защититься от хакеров. Спасибо что заметили, исправлю.

      Delete
  16. вау, то что надо! спасибо большое!

    ReplyDelete
  17. Респект тебе долго мучился почему не запускается проект , оказалось что я использовал версию java ee 7 , на которой и не запускался проект , поменял на 6 как у тебя и все заработало ♥

    ReplyDelete
  18. Спасибо за статью.
    А не могли бы вы подсказать, где можно взять полученый war ?
    В каталоге out его нет (

    ReplyDelete
    Replies
    1. Думаю по умолчанию он и не собирается. Нужно сконфигурировать мавен так чтобы он его собрал нп так: https://stackoverflow.com/questions/44297430/generate-war-file-using-maven

      Delete
  19. Спасибо за пример. А можно ли через конфиг (не через код) зарегистрировать jndi data source для этого tomcat или настроить плагин так, чтобы использовался внешний tomcat?

    ReplyDelete
  20. Да, это просто восхитительно) спасибо вам

    ReplyDelete
  21. Помогите понять, что же нужно IDEA Comm? Создаю проект через Maven, а в POM у меня текст о необходимости лицензии Apache 2.0 и поле неактивно. Но это свободная лицензия, которая и позволяет нам бесплатно установить версию Community. Или я что-то упускаю? И дальше в итоге дело не идет.

    ReplyDelete
  22. Слушай, благодаря твоему туториалу я таки запустил сервер, ато я уже отчаялся и собирался эклипс ставить. Ты ЛУДШИЙ

    ReplyDelete
  23. Если у кого то неполучаеться сделать автоматический запуск браузера после деплоя(после запуска выдает BUILD SUCCESS и на том прерывает прогграму), ТО удалите теги

    ReplyDelete
  24. огромное спасибо. три дня плачу над сервлетами, уже дошла до конца интернета и ничего толкового. но жта статья спасла мою нервную систему СПАСИБО

    ReplyDelete
  25. СПАСИБО ОГРОМНОЕ!!!!!
    Открыли ворота в мир!!!!
    Одно дополнение из 2022 года :) в последней версии проекта с файлом test.bat надо в Pom.xml добавить секцию

    org.apache.maven.plugins
    maven-war-plugin
    3.3.2

    перед секцией с

    org.codehaus.mojo
    exec-maven-plugin

    Иначе не хватает классов для работы. Их как раз надо билд системе взять из новой секции.

    ReplyDelete
    Replies
    1. день убил на то, чтобы понять что твой коммент верный, только мне подошла версия 3.2.2, вот так

      org.apache.maven.plugins
      maven-war-plugin
      3.2.2

      Delete

Post a Comment