Здравствуйте.
Пытаюсь второй день развернуть веб сервис по разным туториалам, через Идею.
Прочитал кучу мануалов и документации по этой теме, но результат все так же печален — из среды запускаю свою конфигурацию, но по адресу localhost:8080, у меня видно следующее:
За безупречный пример я взял вот эту статью: http://devcolibri.com/1043
Если делать все в точности как тут описано — все работает. Однако, структура моего проекта, который я создал на основе всего того, что прочел несколько отличается:
Конфигурация моего проекта выглядит вот так:
Уж не знаю все ли я верно сделал.
Может кто подсказать, что я делаю не так? Идея запускает томкат, но в логах ошибок нет, все выглядит так, будто все работает.
Подозреваю, что war файл не кладется куда-то. Но куда и как должен именно в идее я не понимаю..
покажи файл web.xml. если там с маппингом намудрил что-то — тогда тоже 404ю ошибку можешь получать
если есть ссылочка на код на гитхабе — можешь тоже приложить. на своем компе ковырять удобнее, чем абстрактно так что-то пытаться понять)
UPD: почитал статью, они там собирают мавеном war файл, а потом в разделе деплоймент просто прикрепляют его. соответственно, если были внесены какие-то изменения — то нужно не забыть сделать mvn clean install, перед тем, как нажимать на запуск) лично меня такое поведение геморит, поэтому я использую артефакт с распакованым war-ом, который и отправляется на томкат. из плюсов: меньше текста в pom.xml, а так же возможность более быстрых внесений изменений при работающем сервере.
но если ты работаешь именно через тот вариант, что в статье (билдим мавеном, потом заливаем собраный war-ник на томкат) — то я знаю, что мавен оооочень привередливо относится к структуре проэкта. потому что когда он билдит — он ищет определенные вещи в определенных местах. и если он их там не находит — отказывается работать дальше, ну или собирает, но получается какое-то убожество) так что со структурой проекта в мавене надо быть осторожным)) но если у тебя сервер запускается — могу предположить, что что-то таки да билдится)
да, я собираю именно по такому геморному варианту.
между делом, если сможешь посоветовать какой-то внятный материал, посвященный тому как это делать без мавен, я буду признателен за ссылки.
Вот ссылка на изначальный репозиторий: github.com/borman707/java_habrahabr/
Он не мой, но начал я все это с него. В целом мне процесс работы и сборки проекта понятен, но хотелось бы все же понять, что не так и почему на локалхосте ничего нет. Хотя бы чтобы научиться понимать причины.
Структура web.xml присутствует в репозитории. В принципе, можно сказать, что я ничего не менял.
war файл у меня собирается. Для сборки, я, как ты и сказал, использую clean и install.
ну а дальше уже запускаю конфигурацию.
на вкладке деплоймента я выбираю артифакт.
Вот скрин:
— если допустить, что сборка war'a мавеном успешна, как задеплоить его на локалхост? я делаю что-то не так?
Хорошо, я его сейчас гляну, но хотелось бы видеть именно тот код, который пытаешься запустить ты (могут быть незначительные отличия, которые и приводят к ошибке). потому и попросил ссылку именно на твой вариант, который ты пытаешься запускать :)
Судя по твоему последнему скрину — ты это уже сделал :) Во вкладке Деплоймент — ты указываешь что именно надо задеплоить (залить, загрузить, передать) в томкат. В твоем случае — будет деплоиться тот war-ник, который ты указал. Но если ты получаешь ошибку 404 — тогда скорее всего war-ник успешно задеплоился, но когда томкат пытается его разобрать — он там что-то не находит и потому выдает ошибку) Поэтому надо смотреть что там и как в самом war-нике.
Попробуй найти его на диске и открыть как архив (да, это обычный архив, собственно war так и расшифровывается Web Archive)
просто открой его и проверь, что структура папок/файлов соответствует такому шаблону
в папке classes — должны леж
war мой оказался вообще пустым. я честно говоря, удивлен)
как понять почему туда не попадают мои файлики?
по поводу моего репозитория — я уже пересобирал раз 6 этот проект, так что сейчас я снова начал с нуля. Редактировал только код самого сервлета, и то незначительно
WEB.xml:
<?xml version=«1.0» encoding=«UTF-8»?>
<web-app xmlns=«xmlns.jcp.org/xml/ns/javaee»
xmlns:xsi=«www.w3.org/2001/XMLSchema-instance»
xsi:schemaLocation=«xmlns.jcp.org/xml/ns/javaee xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd»
version=«3.1»>
<display-name>Servlet project</display-name>
<servlet-name>MainServlet</servlet-name>
<servlet-class>MainServlet</servlet-class>
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern> </url-pattern>
</servlet-mapping>
<resource-ref>
DB Connection
<res-ref-name>jdbc/ChatDatabase</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
открыл war файл и увидел, что там нет файла web.xml в папке WEB-INF (а он должен быть, там мапинг сервлетов. используя этот файл томкат будет знать какой из сервлетов вызывать при разных запросах).
заменил в pom.xml директиву failOnMissingWebXml на true и действительно при следующей сборке получил ошибку, что мавен не находит файл web.xml. но с остальными файлами вроде все ок.
а твой war пустой наверное потому, что у мавена не получилось сбилдить его)
Он же изначально идет в репе, я полагал, что он верный.
а можно содержимое твоего pom.xml?
проблема в том, что мавен по умолчанию ищет веб-ресурсы в папочке src/main/webapp
а мы используем немного другую структуру, незнакомую для мавена, где наши веб-ресурсы лежат по адресу web.
соответственно, надо мавену сказать, чтоб он их именно оттуда и брал.
работающий pom.xml выглядит вот так:
можешь порекомендовать какой-нибудь ресурс по изучению мавена?
а так же вот этого плагина
хотелось бы понимать на что направлены остальные действия в нем (например деплой)
там красным обведено.
получается, что каждый раз при запуске (когда нажимаешь зеленую кнопку play типа) — идея сначала запустит вместо тебя автоматически mvn clean install, таким образом мавен тебе пересоберет проект в war файл с тем же названием, что и был, и идея его уже задеплоит в томкат.
чтоб сделать такое просто жмешь там +, выбираешь что-то типа run maven goal и пишешь там ручками clean install
тогда получится, что при нажатии на кнопочку play тебе ничего не надо будет самостоятельно еще выполнять, все будет сделано автоматически :)
и да, довольно часто люди, которые начинают щупать веб-программирование на джаве — сталкиваются именно с непонятками в мавене.
лично я предпочитаю англоязычные ресурсы, там намного больше информации. вот пока решал эту проблему — погулил там, сям, а ответ в итоге нашел в официальной документации мавена. там реально хорошо написано. рекомендую)
если уж совсем в двух словах, то мавен — это система управления жизненным циклом проекта (да, мне сначала тоже казалось, что вроде все слова отдельно и понятны, но что они все вместе обозначают — хз). просто нужно понять, что мавен умеет делать очень много чего. у проекта есть жизненный цикл. сначала проект пустой, потом ты его как-то наполняешь, потом может тесты еще пишешь, потом готовый результат хочешь задеплоить куда-то. вот это все вместе и есть жизненный цикл проекта. так вот мавен тебе помогает на каждом шаге)
лично я обожаю мавен как менеджер пакетов, где я ему говорю какие мне библиотеки нужны, а он мне их скачивает и подключает, причем еще подкачивает другие библиотеки, от которых зависят те, которые мне нужны, и все они будут «правильных» версий (то есть если библиотека А, которая мне нужна требует библиотеку Б версии 1.7, а библиотека С, которая тоже мне нужна требует ту же библиотеку Б, но версии 1.5 — то мавен сам все это разрулит, я об этом даже не буду знать).
то, что у тебя на скрине — это так называемые «цели мавена» (maven goals). дело в том, что нам не всегда необходимо деплоить. иногда мы хотим просто проверить компилируется ли, иногда прогнать тесты, иногда просто собрать, но не деплоить. так вот эти «цели» как-раз и позволяют это сделать)
clean — удаляет результаты предыдущих запусков, вызывается отдельно
общее правило, что каждая следующая цель
я все почитаю)