Как стать автором
Обновить

Простая инсталляция Java веб-приложения (часть 2)

Время на прочтение5 мин
Количество просмотров1.3K
На самом деле речь тут пойдет уже не о Java. Допустим, у вас есть некторый zip с некоторой программой (например созданный в первой части) — и вы хотите сделать для него msi (для установки через Windows Installer). Это может быть что угожно — jetty + ваш war, апач плюс php-ха — в данном случае это уже не важно. Важно что это «нечто» — что надо после установки запустить в качестве сервиса

Как это сделать при помощи WiX под катом

image



Возможные альтернативы


Прежде чем мы начнем танцы с бубном вокруг WiX — считаю своим долгом рассказать об альтернативах, которые я рассматривал — и, которые, возможно, вполне вас устроят

WItem Installer for Java

Вот тут www.witemsoft.com/forjava можно найти достаточно простую и главное бесплатную программу, которая может создать инсталлер для вашего java-веб приложения — просто натравливаете ее на ваш варник и ставите галку «Веб-приложение» — вуаля — получаете MSI который все ставит.

Одна проблема — она пакует в дистрибутив Jetty 4 (программа достаточно старая) — который очень стар и в моем случае не позволил мне запускать мое приложение. Адекватно исправить это я не смог (программа не open-source).

А жаль — в принципе эта программа делала именно то что надо — все просто и понятно.

Advanced Installer for Java

Еще один кандидат: www.advancedinstaller.com/java.html

Более сложный в использованни (но по прежнему достаточно простой) — но и зато намного более мощный. Все делается удобными визардами. Автоматом добавлять jetty — не умеет — так что это надо сделать самому (например как описано в первой части).
Для Java-программ можно добавить такие фички как автоматическую проверку версии установленной Java, автоматическое скачивание и установку оной при необходимости.

Бесплатная версия умеет многое — и как я сказал — относительно проста в использовании, но — установка сервиса — только начиная с версии «Profi» — которая стоит $249 (варианты вареза я не рассматриваю по идеологическим соображениям).

Вообщем — если у вас есть $249 — можно дальше не читать. Мне же было жалко тратить эти деньги при условии, что другие фичи Profi-версии мне были не нужны — и платить 250 баксов только за создание сервиса мне показалось перебором

Что такое WiX


Итак — WiX — wix.sourceforge.net — набор command-line тулзов которые позволяют создавать MSI из XML-файлов
Несколько слов об этом проекте. Проект WiX во многом знаковый — если не ошибаюсь — это первый проект, который Microsoft отдал в Open-Source и выложил на хостинг в SourceForge (да! и такое бывает!). К сожалению информации по проекту и доку очень мало — еще меньше на русском — потому тут я остановлюсь на нем подробней

Проект реализован на .NET — так что нам потребуется windows (с mono просто не пробовал) — и, увы уважаемые джависты — .NET runetime.

Итак — поехали

Еще раз про требования к инсталяции


Еще раз освежим, что мы хотим от полученного инсталлера:
  • В первую очередь поставить все необходимые файлы
  • Позволить пользователю выбрать куда ставить
  • Сконфигурировать Jetty что бы запускался как сервис
  • Запустить этот сервис после инсталяции и делать это всегда при запуске системы
  • Поместить ссылку на наше приложение на Десктоп и в Старт — что бы пользватель мог легко запустить браудер натравленный на наше приложение
  • Ну и что бы все корректно удалялось при деинсталляции


Конечно же хотелось бы еще много чего — автоматическая установка JRE при отсутсвии оного, конфигурирование порта на котором запущен сервис и пр. и пр. Но — это видимо в следующей версии — пока что простейшая установка сервиса

Первый WiX файл


Хм… к сожалению не нашел способа вставить исходники в xml хабрапост — он их сильно корябит :( (Буду рад совету как это правильно сделать)
Потому придется давать ссылки на исходую статью (написанную на английском некоторое время назад) — с комментами тут.

Итак, простейший файл wix с которого мы начнем работать выглядит следующим образом: www.emforge.org/wiki/Windows+Installer+For+WAR#section-Windows+Installer+For+WAR-FirstWiXFile

Проставьте сгенерированные GUID-ы вместо вопросов, замените EmForge — на название вашего продукта — а EmDev Limited — на название вашей компании — первая заглушка готова. Это пока еще не реальная инсталяция, но тут мы:
  • Определили назварие нашего продукта
  • Определили дирректорию TARGETDIR — куда будем все ставить
  • Создали папочку EmForge в «Start -> All Programs»
  • Определили директории для Desktop и Program Files

ЗаДжарьте ваши классы


Как мы увидим позже, WiX достаточно странно работает с каталогами. Так что — чем меньше каталогов в вашем приложении — тем проще для вас. Плюс ко всему — при дальнейшей разработке любые перемещения фолдеров могут драматически отразится на вашей инсталяции. Если мы ставим web-приложение, то в каталоге WEB-INF/classes у нас лежит много чего. Я, как и многие другие программисты — люблю делать «рефактор» — перемещая классы из одного пакета в другой — и я абсолютно не хочу при этом думать — как это отразится на моей инсталяции. Потому — просто дружеский совет — запакуйте все свои классы jar-ом и положите его в WEB-INF/lib — после чего с чистой совестью удалите фолдер WEB-INF/classes

Танцы с фолдерами


Теперь нам надо сказать — что же мы хотим поставить. Казалось бы — чего проще — указал на какую-нибудь директорию и сказал — вот это все, вместе с поддиректориями — я хочу видеть в инсталяции (описанные выше программи примерно так и делают). Но — увы, WiX видимо предоставляет достаточно низкоуровневый интерфейс в Windows Installer-у, так что так он не умеет.
Насколько я понял — инсталяция содержит несколько компонент (логично), каждый компонент может содержать несколько файлов — но не фолдеров (нелогично — по крайней мере для меня). Потому, для каждого каталога в вашей инсталяции должен быть создан отдельный компонент, для которого должен быть задан отдельный GUID ну и так далее и тому подобное (еще не зажарили ваши классы??? еще не поздно это сделать — если конечно вы не хотите задавать GUID для каждого package-а)

К счастью, все-таки некоторое средство автоматизации есть — это программа tallow (входит в wix 2.0):
#PathToWix\tallow -d c:\Path\To\Your\Distro > tallow.wxs

где PathToWiX — путь где вы поставили WiX, а c:\Path\To\Your\Distro — путь, где лежат файлы, которые вы хотите поместить в инсталяцию
В результате вы получите файл похожий на этот
Теперь вам надо только прогенерить GUID-ы и вставить их вместо всех PUT-GUID-HERE (почему tallow не умеет делать этого автоматом — не понимаю!) и вставить все содержимое тега DirectoryRef (без самого тега) внутрь тега ProgramFilesFolder и заменим Directory0 на INSTALLDIR (это позволит нам выбирать путь установки во время инсталяции)

Описание Feature


Один MSI можетустанавливать несколько Feature, которые включают некоторое количество компонент. В нашем случае фича у нас одна — и нам ее надо описать после всех тегов Directory — куда надо положить все компоненты, что нам нагенерил tallow. Что-то типа такого

Ну вот и все — первая инсталяция готова — создаем MSI:
# candle emforge.wxs
# light -out EmForge.msi emforge.wixobj

Запускаем его — без лишних вопросов все должно поставиться — а потом (если надо) — удалиться.

Настройка сервиса и линков


Теперь настроим инсталяцию что бы она конфигурировала и стартовала сервис. Для этого вынесите Jetty-Service.exe в отдельный компонент и пропишите его конфигурацию аналогично тому, как показано тут и добавьте новый компонент в фичу.
Тут все очевидно (надеюсь) — ServiceInstall — сервис инсталирует, ServiceControl — говорит что установке сервис надо запустить, а при деинсталяции — остановить и удалить.
В качетсве бонуса IniFile создаст линки везде где захотите

Побольше ГУЯ


Что бы инсталяция не выглядела такой куцой — добавим ей ГУЯ (не поймите меня неправильно) — пример показан тут
И соберем msi при помощи
# candle EmForge.wxs
# light -out EmForge.msi EmForge.wixobj PathToWix\wixui.wixlib -loc PathToWix\WixUI_en-us.wxl

(на самом деле все сильно аналогично C++ — candle — компилятор, light — компоновщик, wxs — исходник, wixobj — объектник, wxl — либа)
И ваша инсталяция перестанет быть столь мочаливой!

Лицензия


Вполне естественное желание заменить лицензию, которую wix показывает по умолчанию на что-то свое — все просто — положите License.rtf с необходимым вам текстом там же где и остальные файлы — и light подцепит его

Итого


Ну вот вроде и все. Если все сделано правильно — полученный msi должен выполнять все поставленные задачи. В идеале не должно занять более 2-3 часов (и вы с чистой совестью можете потратить съэкономленные 250 баксов на что-нибудь более полезное)

Если что-то непонятно — всегда можете задавать вопросы — постараюсь помочь. Можно использовать как пример wix-файл EmForge-а — полный исходник лежит тут
Теги:
Хабы:
+5
Комментарии5

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн