• ,

развертывание веб сервиса на Tomcat в Intellij Idea

Здравствуйте.

пытаюсь второй день развернуть веб сервис по разным туториалам, через Идею.
Прочитал кучу мануалов и документации по этой теме, но результат все так же печален — из среды запускаю свою конфигурацию, но по адресу localhost:8080 у меня видно следующее:



за безупречный пример я взял вот эту статью: devcolibri.com/1043
если делать все в точности как тут описано — все работает.
Однако, структура моего проекта, который я создал на основе всего того, что прочел несколько отличается:


Конфигурация моего проекта выглядит вот так:


уж не знаю все ли я верно сделал.
Может кто подсказать, что я делаю не так? Идея запускает томкат, но в логах ошибок нет, все выглядит так, будто все работает.
Подозреваю, что war файл не кладется куда-то. Но куда и как должен именно в идее я не понимаю…

14 комментариев

fatfaggy
  • fatfaggy
  • +1
  • Комментарий отредактирован 2017-10-27 18:47:25 пользователем fatfaggy
покажи как у тебя выглядит артефакт? это там, где настройки проекта, там где можешь либы всякие подключать, так вот там есть раздел с артефактами. ну и проверь, что именно этот артефакт у тебя при запуске и развертывается (на последнем скрине вторая вкладка, Деплоймент). Это если проблема с артефактом, с которой я постоянно сталкивался раньше сам)) особенно, когда решал поменять структуру проэкта

покажи файл web.xml. если там с маппингом намудрил что-то — тогда тоже 404ю ошибку можешь получать

если есть ссылочка на код на гитхабе — можешь тоже приложить. на своем компе ковырять удобнее, чем абстрактно так что-то пытаться понять)

UPD: почитал статью, они там собирают мавеном war файл, а потом в разделе деплоймент просто прикрепляют его. соответственно, если были внесены какие-то изменения — то нужно не забыть сделать mvn clean install, перед тем, как нажимать на запуск) лично меня такое поведение геморит, поэтому я использую артефакт с распакованым war-ом, который и отправляется на томкат. из плюсов: меньше текста в pom.xml, а так же возможность более быстрых внесений изменений при работающем сервере.

но если ты работаешь именно через тот вариант, что в статье (билдим мавеном, потом заливаем собраный war-ник на томкат) — то я знаю, что мавен оооочень привередливо относится к структуре проэкта. потому что когда он билдит — он ищет определенные вещи в определенных местах. и если он их там не находит — отказывается работать дальше, ну или собирает, но получается какое-то убожество) так что со структурой проекта в мавене надо быть осторожным)) но если у тебя сервер запускается — могу предположить, что что-то таки да билдится)
wolfio
привет, спасибо что отозвался.
да, я собираю именно по такому геморному варианту.
между делом, если сможешь посоветовать какой-то внятный материал, посвященный тому как это делать без мавен, я буду признателен за ссылки.

Вот ссылка на изначальный репозиторий: github.com/borman707/java_habrahabr/
Он не мой, но начал я все это с него. В целом мне процесс работы и сборки проекта понятен, но хотелось бы все же понять, что не так и почему на локалхосте ничего нет. Хотя бы чтобы научиться понимать причины.

Структура web.xml присутствует в репозитории. В принципе, можно сказать, что я ничего не менял.

war файл у меня собирается. Для сборки, я, как ты и сказал, использую clean и install.
ну а дальше уже запускаю конфигурацию.

на вкладке деплоймента я выбираю артифакт.
Вот скрин:

— если допустить, что сборка war'a мавеном успешна, как задеплоить его на локалхост? я делаю что-то не так?
fatfaggy
если сможешь посоветовать какой-то внятный материал, посвященный тому как это делать без мавен, я буду признателен за ссылки.
честно говоря, лучше сразу учиться работать с мавеном. хотя бы использовать его в качестве менеджера пакетов, но не обязательно собирать проект именно им. без мавена тебе придется вручную искать и скачивать все зависимости и ложить их в нужные папочки, потом в идеи подключать эти зависимости вручную, итд. Мавен же значительно облегчает всю эту рутину. Ты ему просто говоришь какие тебе библиотеки нужны и каких версий, а все остальное он уже делает за тебя сам.

Он не мой, но начал я все это с него.
Хорошо, я его сейчас гляну, но хотелось бы видеть именно тот код, который пытаешься запустить ты (могут быть незначительные отличия, которые и приводят к ошибке). потому и попросил ссылку именно на твой вариант, который ты пытаешься запускать :)

если допустить, что сборка war'a мавеном успешна, как задеплоить его на локалхост?
Судя по твоему последнему скрину — ты это уже сделал :) Во вкладке Деплоймент — ты указываешь что именно надо задеплоить (залить, загрузить, передать) в томкат. В твоем случае — будет деплоиться тот war-ник, который ты указал. Но если ты получаешь ошибку 404 — тогда скорее всего war-ник успешно задеплоился, но когда томкат пытается его разобрать — он там что-то не находит и потому выдает ошибку) Поэтому надо смотреть что там и как в самом war-нике.
Попробуй найти его на диске и открыть как архив (да, это обычный архив, собственно war так и расшифровывается Web Archive)
просто открой его и проверь, что структура папок/файлов соответствует такому шаблону
Структура папок в веб приложении java
в папке classes — должны лежать твои скомпилированные джава файлы (сервлеты, как я понимаю)
в папке lib — библиотеки, которые тебе нужны для твоего проекта
wolfio
  • wolfio
  • 0
  • Комментарий отредактирован 2017-10-27 21:01:03 пользователем wolfio
спасибо за детальный коммент.
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>
fatfaggy
  • fatfaggy
  • 0
  • Комментарий отредактирован 2017-10-27 21:12:29 пользователем fatfaggy
нуу, я вот только-что скачал тот проект с гитхаба, скопировал с девколибри то, что они предлагают добавить в pom.xml, собрал, залил и получил ошибку 404.
открыл war файл и увидел, что там нет файла web.xml в папке WEB-INF (а он должен быть, там мапинг сервлетов. используя этот файл томкат будет знать какой из сервлетов вызывать при разных запросах).
заменил в pom.xml директиву failOnMissingWebXml на true и действительно при следующей сборке получил ошибку, что мавен не находит файл web.xml. но с остальными файлами вроде все ок.
а твой war пустой наверное потому, что у мавена не получилось сбилдить его)
wolfio
на девколибри структура проекта другая, я оттуда pom.xml не брал.
Он же изначально идет в репе, я полагал, что он верный.

а можно содержимое твоего pom.xml?
fatfaggy
  • fatfaggy
  • 0
  • Комментарий отредактирован 2017-10-27 21:29:07 пользователем fatfaggy
кажется разобрался.
проблема в том, что мавен по умолчанию ищет веб-ресурсы в папочке src/main/webapp
а мы используем немного другую структуру, незнакомую для мавена, где наши веб-ресурсы лежат по адресу web.
соответственно, надо мавену сказать, чтоб он их именно оттуда и брал.

работающий pom.xml выглядит вот так:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>untitled2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>web</directory>
                        </resource>
                    </webResources>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>


    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>3.0-alpha-1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javaee</groupId>
            <artifactId>javaee-api</artifactId>
            <version>5</version>
        </dependency>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20141113</version>
        </dependency>

        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.8.11.2</version>
        </dependency>


    </dependencies>

</project>
не хватало лишь вот этих строк, как видишь
                    <webResources>
                        <resource>
                            <directory>web</directory>
                        </resource>
                    </webResources>
еще я изменил строки
<source>1.8</source>
<target>1.8</target>
чтоб использовалась 8я джава, а на 1.5, как было.

ну и конечно же
<packaging>war</packaging>
чтоб мавен запаковывал именно в war
wolfio
невероятно! работае)) большой спасибо) 2 дня сидел над этим, даже подумать не мог, что проблема с мавеном.
можешь порекомендовать какой-нибудь ресурс по изучению мавена?
а так же вот этого плагина

хотелось бы понимать на что направлены остальные действия в нем (например деплой)
fatfaggy
честно говоря, вообще редко находил что-то внятное о мавене на русском. в основном, что-то такое, как делают девколибри: пару слов написали, пару скринов залили, а что, как и почему — все-равно не понятно.
и да, довольно часто люди, которые начинают щупать веб-программирование на джаве — сталкиваются именно с непонятками в мавене.
лично я предпочитаю англоязычные ресурсы, там намного больше информации. вот пока решал эту проблему — погулил там, сям, а ответ в итоге нашел в официальной документации мавена. там реально хорошо написано. рекомендую)

если уж совсем в двух словах, то мавен — это система управления жизненным циклом проекта (да, мне сначала тоже казалось, что вроде все слова отдельно и понятны, но что они все вместе обозначают — хз). просто нужно понять, что мавен умеет делать очень много чего. у проекта есть жизненный цикл. сначала проект пустой, потом ты его как-то наполняешь, потом может тесты еще пишешь, потом готовый результат хочешь задеплоить куда-то. вот это все вместе и есть жизненный цикл проекта. так вот мавен тебе помогает на каждом шаге)
лично я обожаю мавен как менеджер пакетов, где я ему говорю какие мне библиотеки нужны, а он мне их скачивает и подключает, причем еще подкачивает другие библиотеки, от которых зависят те, которые мне нужны, и все они будут «правильных» версий (то есть если библиотека А, которая мне нужна требует библиотеку Б версии 1.7, а библиотека С, которая тоже мне нужна требует ту же библиотеку Б, но версии 1.5 — то мавен сам все это разрулит, я об этом даже не буду знать).

то, что у тебя на скрине — это так называемые «цели мавена» (maven goals). дело в том, что нам не всегда необходимо деплоить. иногда мы хотим просто проверить компилируется ли, иногда прогнать тесты, иногда просто собрать, но не деплоить. так вот эти «цели» как-раз и позволяют это сделать)
clean — удаляет результаты предыдущих запусков, вызывается отдельно
общее правило, что каждая следующая цель включает в себя предыдущую.
validate — просто проверяет корректность, проверяет помник, так сказать
compile — проверяет корректность (validate) и потом компилирует твои исходники
test — validate -> compile -> и тогда прогоняет тесты. ну в общем каждая следующая состоит из предыдущих
package — делает все что и тест, а потом собирает твой проект в какой-то пакет
и так далее. подробнее тут.
ну а ты просто выбираешь какую из «целей» ты бы хотел сейчас выполнить и все, мавен ее начинает выполнять.
вот тут можешь ознакомиться с самыми азами мавена чтобы хоть понимать что там и к чему.
ну а так — то путем проб и ошибок каждый день узнаешь все новое и новое о мавене))
wolfio
большое спасибо
я все почитаю)
fatfaggy
  • fatfaggy
  • 0
  • Комментарий отредактирован 2017-10-27 21:41:36 пользователем fatfaggy
ну и раз уж ты решил все-таки билдить мавеном war файл и потом заливать его в томкат — то предлагаю на вкладке Деплоймент сделать вот как-то так
Deployment war файла идеей, используя maven goals: clean и install
там красным обведено.
получается, что каждый раз при запуске (когда нажимаешь зеленую кнопку play типа) — идея сначала запустит вместо тебя автоматически mvn clean install, таким образом мавен тебе пересоберет проект в war файл с тем же названием, что и был, и идея его уже задеплоит в томкат.
чтоб сделать такое просто жмешь там +, выбираешь что-то типа run maven goal и пишешь там ручками clean install
тогда получится, что при нажатии на кнопочку play тебе ничего не надо будет самостоятельно еще выполнять, все будет сделано автоматически :)
fatfaggy
Если будет интересно, я сделал пошаговый туториал как я обычно создаю web проект в идее.
wolfio
Спасибо, и правда очень подробно) хотя теперь я всю эту концепцию уже знаю)) 2е суток просидел с этим)
noxior
Подскажите на какой версии java сейчас javarush
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.