Статьи

Как сделать исполняемый файл WAR

Если вы когда-либо использовали CI-сервер Jenkin , вы, вероятно, видели их очень простую однострочную инструкцию для начала работы: java -jar jenkins.war. Теперь это один из замечательных способов заставить ваших пользователей опробовать ваш продукт!

В этой статье я покажу вам, как сделать файл WAR самостоятельно исполняемым, как описано выше. Прежде чем я сделаю это, позвольте мне рассказать вам о небольшом веб-приложении, которое я сделал, а затем я покажу, как я превратил его в управляемую войну.

Требование: делать заметки эффективно

Я склонен делать много записей, когда я делаю свою работу. Вместо использования copy Windows Notepad.exe я бы настроил свой cygwin .bash_profile следующим образом:

function e() { /cygdrive/C/apps/notepad++.exe $(cygpath -w "$@") ; }
function n() { F="$HOME/notes/$(date "+%Y%m%d-%H%M%S").markdown"; touch $F; e $F; }

У меня установлен Notepad ++ , но вы можете использовать любой текстовый редактор, который вам нравится. При такой настройке в любом месте моего терминала я могу просто набрать n, чтобы открыть всплывающий редактор GUI, и мой файл заметок будет готов для записи заметок. В имени файла будет указана дата отметки времени, и я хотел бы записать их с простым синтаксисом Markdown для более удобного просмотра позже. Поскольку я пишу их в виде обычного текста, поиск с использованием grep MYSTUFF ~ / notes / * очень прост и быстр. Как только я нашел его, я могу быстро отредактировать его с помощью e ~ / notes / 20120814-000000.markdown.

Этот метод записи заметок является быстрым и переносимым между моими системами Linux и Windows (ну, я должен выбрать другой редактор для ОС, но это не так уж и сложно). Теперь, так как я уже записал свои заметки в уценке, я не смогу увидеть красивый результат, если не использую онлайн-конвертер . Поэтому я подумал, что было бы здорово, если бы у меня было веб-приложение, которое позволяло бы мне записывать эти заметки, и в то же время дать мне быстрый быстрый просмотр Markdown to html.

Представляем webnotepad.war

Чтобы улучшить свои заметки, я создал небольшое веб-приложение под названием webnotepad.war . Это действительно просто одностраничное веб-приложение, которое записывает заметки в синтаксисе Markdown, просматривает его и позволяет искать в нем. Это также позволяет редактировать старые заметки тоже. Все это просто класс сервлетов, и он даже не использует JSP.

Однако после того, как у меня появилось это маленькое веб-приложение, меня беспокоит, что мне всегда будет нужен сервер приложений для его запуска. (Я могу запустить mvn tomcat7: запустить непосредственно из моего исходного проекта, но для удовлетворения первоначальной сборки Maven мне потребуется подключение к Интернету.) Так что здесь приведен прекрасный пример использования, который был бы очень хорош, чтобы сделать этот war-файл самостоятельно исполняемым. На самом деле я преуспел в этом маленьком эксперименте. Вы можете загрузить его и попробовать сами с помощью java -jar webnotepad.war, а затем просмотрите http: // localhost: 8080. Если у вас конфликт портов, попробуйте —httpPort = 8081.

Конечно, вы продолжаете развертывать webnotepad.war и на любом сервере приложений.

Создание исполняемого файла войны

Прежде чем вы захотите сделать war исполняемым, вы должны сначала собрать и упаковать ваше обычное веб-приложение. Хитрость в том, чтобы сделать военный файл работоспособным, заключается в том, что вы хотите дополнительно добавить главный класс в META-INF / MANIFEST.MF в военный файл. И из этого нам нужно загрузить и запустить встроенный сервер сервлетов с развернутым файлом самообороны. Я заметил, что Дженкинс использует сервер Winstone . Я был поражен, обнаружив, что этот сервер имеет размер только 300K! Он поддерживает полный Servlet 2.5 spec! При желании он может поддерживать JSP с Jasper, что обойдется вам в 3 МБ. Это все еще очень маленькая цена, чтобы заплатить по сравнению с любым контейнером сервлетов!

Создание WinstoneMain.java для основного класса не сложно. Однако заставить Maven упаковать все довольно сложно. Теперь мой webnotepad.war не нуждается в Jasper, но если вы это сделаете, вам особенно нужны эти файлы вне WEB-INF / lib, потому что вы не хотите, чтобы ваш обычный сервер приложений загружал их! В противном случае вы получите очень странные ошибки.

В моем примере я добавил в WEB-INF / lib-winstone, а затем WinstoneMain извлечет их, а затем загрузит winstone.Launcher с помощью пользовательского загрузчика классов. Кроме того, нам нужно использовать некоторые параметры Winstone, чтобы правильно запустить веб-сервер. Я использую этот webnotepad / pom.xml, чтобы упаковать файл war. Вы можете легко использовать мой пример, потому что я создал их в отдельном профиле, и вам просто нужно добавить его в свой веб-модуль / pom.xml. В моем демонстрационном проекте вы должны запустить mvn package -Pdist для генерации исполняемого файла war.

ПРИМЕЧАНИЕ. Я заметил, что проект Winstone не проявлял особой активности с момента последнего выпуска с 2008 года. Но я был рад обнаружить, что в GoogleCode Winstone есть проект ветвления, который показывает действия. Я не использовал это для моей демонстрации, но это выглядит многообещающе.