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

    На самом деле речь тут пойдет уже не о 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-а — полный исходник лежит тут
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 5

      0
      Хороший туториал по WiX
      www.tramontana.co.hu/wix/

      То как работает WiX кажется иногда странным, как пример с папками, но видимо на это есть свои причины.
      Где-то читал что Windows Installer оперирует не файлами и папками, а «текущее состояние системы» — «которое нужно получить». В результате все эти танцы при простых проектах.

      Ещё есть дополнительная утилита для WiX —
      Paraffin.
        0
        Уупс — не туда добавить коммент ткнул. Вообщем еще раз хочу сказать огромное спасибо за парафин — судя по описанию — «то что доктор прописал»
        0
        Вредный и ненужный инструмент.
          0
          За парафин ОГРОМНОЕ спасибо — судя по всему автор как раз поплясял вокруг тех же граблей — и сделал утилиту более удобную для использования! При следующем релизе попробую — по описанию должно сильно облегчить жизнь!

          Я так понимаю — wix — это просто XML представление внетренней базы Windows Installer-а — то есть, если внутренняя база — это машинные коды — то wix — ассемблер. Можно сделать все (вон — инсталлер для того же офиса получается на нем написан) — но вопрос только какими усилиями
            0
            Вообще основная полезность Windows Installer — это возможность автоматической установки по политике в Active Directory.
            Хотя можно и обычные exe инсталлеры от NSIS и т.п. через политику ставить с помощью ZAP или даже воспользоваться чем-то вроде WPKG.

            Ну и вообще это извечная проблема автоматической инсталляции и апдейта =)

            Only users with full accounts can post comments. Log in, please.