#deepjava #otus

Приходилось ли вам писать Java приложения без функции

public static void main(String[] args){...}?



На первый взгляд может показаться, что такое приложение бессмысленно. Ведь его нельзя запустить. Точнее его нельзя запустить через вызов java -jar name.jar. И тем не менее, многие Java разработчики регулярно пишут такие приложения. И запаковывают их не в jar файлы, а в… war файлы. Давайте сегодня с этими war файлами и разберемся.



Продолжая открытый вопрос про запуск приложения нужно отметить, что его код нельзя исполнить в его собственном потоке main. Но мы можем исполнить его в других потоках. По аналогии с библиотеками: библиотека не запускает себя сама, вы запускаете библиотеку в собственных потоках. Ваше приложение может быть “библиотекой” для другого приложения. И в этом случае, другое приложение называют application server. Application server запускает ваше приложение в собственных потоках. Для него ваш код как актеры для Голливуда. Не актеры звонят в Голливуд. Голливуд звонит актерам. Таким образом, вы пишите приложения не с использованием библиотек, а для application server-а.



В общем случае application server должен быть написан по спецификации Java EE. Но есть частные случаи, которые поддерживают только работу веб сервера и сервлетов. Их называют веб серверы и сервлет-контейнеры. Вот для них, как раз, Java разработчики и создают war файлы.



Итак, war или WebARchive это jar, но в отличие от обычного в нем:

Нет мета информации о методе main, с выполнения которого должно начинаться выполнение приложения.

Есть директория WEB-INF и в ней web.xml -- это файл с инструкциями для сервлет-контейнера.

Есть сервлеты. Без них war файл практически бесполезен.

Могут быть файлы статических страниц. Да-да jar в котором в корне лежат index.html, index.js и index.css :о)



Приготовить такой war файл можно при помощи плагина maven-war-plugin к maven. А запускать в любом удобном вам сервлет-контейнере, например в Tomcat или Jetty, просто копированием war файла в директорию webapps. Только при копировании не забудьте переименовать его в root.war. Интересно зачем? Мы и это на занятиях разбираем.