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

    Итак, вы написали свое супер веб-приложение на Java и теперь хотите что бы как можно больше людей его скачало, задеплоило и начало пользоваться? Все отлично, только для для некорых java-прораммистов, особенно для тех, кто последние цать лет прожил в мире J2EE может быть открытием, что для 99,9% людей в этом мире слова «Просто задеплойте этот WAR-ник на ваш любимый сервер» окажутся пустым звуком. Ну ок, может не 99,9% а 99,8% — ну или около того.

    Ниже следует первая часть туториала о том, как из вашего варника сделать красивый Windows Installer (да-да, мало того что большинство людей не знают слова деплой, так они еще и Windows пользуются!) с использованием WiX


    Постановка задачи


    Итак, мы имеем:
    • Само веб приложение написанное на Java. В данном случае предполагается что сборка приложения ведется с помощью maven-а (если вы еще этого не делаете — очень рекомендую). В результате сборки вы получаете war-файл (ок — не полноценный EAR — но для EAR вам просто необходимо будет паковать другой сервер)
    • Предполагается что данное приложение работает под сервером Jetty 6.0.x (если нет — опять-таки — вам прсто надо будет паковать другой сервер)

    Хотим создать установку нашего приложение через Windows Installer. В ходе установки необходимо:
    • Выполять стандартные действия (спросить куда ставить, показать лицензию, показать прогресс)
    • Установить само приложение в указанное место
    • Сконфигурировать его запуск в качестве сервиса
    • Добавить ссылку на главную страницу приложения на Десктоп (что бы пользователь мог лекго к нему обратиться)


    Чем будем пользоваться:
    • maven для сборки
    • jetty в качестве сервера
    • WiX для создания инсталлера

    Все продукты являются Open-Source

    Некоторые моменты возможно будут раскрыты тут не полностью — любые вопросы и пожелания приветсвуются. Данное решение применено для создания инсталлера для проекта EmForge — данный проект является open-source, так что рабочий пример можно получить из его исходников (например через web-viewer: www.emforge.org/browser/EmForge/trunk или просто забрав исходники из svn-репозитория svn.emforge.org/svn/emforge/EmForge/trunk

    В данной части мы рассмотрим процесс создания zip-архива с приложением, готовым к запуску

    Итак, поехали…

    Паковка приложения вместе с Jetty


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

    Идея была взята с этого блога: blog.devspan.com/2008/02/creating-distributable-war-project-with.html — тут я опишу только основную идею (если надо — скажите — распишу подробней):
    • У нас есть веб-проект собираемый мавеном (http://www.emforge.org/browser/EmForge/trunk/emforge-web в нашем случае)
    • Создаем новый проект launcher. Структу проекта и требуемые файлы можно просто скопировать с emforge-launcher допилив его напильником под ваш проект: www.emforge.org/browser/EmForge/trunk/emforge-launcher
    • Конфигурируем в данном проекте maven-assembla-plugin, что бы тот брал варник и требуемые jetty-библиотеки из maven-репозитория и клал их в «правильные» места
    • Сначала запускаем mvn clean install в нашем веб-проекте, что бы maven собрал и положил наш проект в локальный репозиторий
    • Затем запускаем mvn clean assembly:assembly в launcher-проекте — в результате чего мы получим требуемый zip


    В результате мы получаем zip в котором будет лежать jetty и ваше приложение. Структура зипа будет примерно следующая:
    - etc Каталог с настройками Jetty
    - jetty.xml
    - jetty-win32-service.xml
    - webdefault.xml
    - lib Каталог с с файлами, требуемыми для старта jetty
    - wrapper.dll
    - wrapper-3.2.0.jar
    - jety-6.1.14.jar
    - jetty-util-6.1.14.jar
    - jetty-win32-service-java-6.1.14.jar
    - servlet-api-2.5-6.1.14.jar
    - start-6.1.14.jar
    -logs Место куда должны ложиться логи
    - webapps
    - root А тут должно оказаться ваше приложение

    Jetty-Service.exe Этот файл поможет запустить jetty как сервис
    jetty-service.conf А это го настройка


    Пожалуйста проверьте:
    • jetty-service.conf должен содержать имя вашего сервиса. По умолчанию это будет Jetty — но наверняка вы захотите что-нибудь другое
    • так же проверьте что jetty-service.conf содержит правильные пути на libs & logs
    • В jetty.xml проверьте порт, на котором будет запущен сервис — по умолчанию это 8080, но этот порт очень широко используется и потому лучше использовать какой-нибудь другой порт
    • каталог root должен содержать ваше веб-приложение, то есть каталог WEB-INF должен лежать прям под root


    Ну вот и все на данный момент. В принципе, на этом можно и остановится — не ленивый пользователь уже может просто скачать зип, распаковать его и запустить сервер с вашим приложением при помощи run.bat или run.sh

    О решении для «ленивых» пользователей мы поговорим в следующей серии
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

      –1
      Смысл делать из пользовательских машин (Web-)сервисы я не уловил.

      Зачем это надо пользователям?
        +2
        Понятно что веб-приложение не будет ставится на каждую машину в сети — но даже на эту одну единственную — кто-же должен поставить?
        0
        «Deploy» — это операция копирования WAR-файла в папку Web-контейнера/Web-сервера с последующей автораспаковкой содержимого в рабочий каталог сервера. Последняя операция осуществляется без участия администратора — дело администратора только предоставить WAR-файл.

        Куда уж проще?
          0
          Можно провести опрос на Хабре (притом что Хабр — достаточно специфичная аудитория) «Знаете ли вы что означают слова „Deploy“ и „Web-Container“» — хорошо если наберется половина (при том что — еще раз — Хабр — публика очень специфичная — достаточно много Java-программистов)
            –1
            Можно сколько угодно проводить опросов, но спецификация JEE (фактически — отраслевой стандарт) написана не для того, чтобы принимать или отвергать её решения простым голосованием на форуме слаборазбирающимися в этом вопросе потенциальными пользователями.
              0
              Вопрос в голосовании — не в том что бы отвергать или утверждать стандарт (не мы создавали этот стандарт — не нам его и отвергать) а понять сколько людей понимают — о чем идеть речь

              Я приводил пример с голосованием — просто что бы показать — что даже на хабре может найтись большое количество людей — которые не знают что-такое Deploy и Web-Container (Servlet-Conatiner).
                0
                И упаси меня бог отменять J2EE — это же рубить сук на котором сидишь! Я же благодаря этим отраслевым стандартам себе на жизнь зарабатываю (за что им — стандартам этим — огромное спасибо!)
                0
                Можно сколько угодно проводить опросов, но спецификация JEE (фактически — отраслевой стандарт) написана не для того, чтобы принимать или отвергать её решения простым голосованием на форуме слаборазбирающимися в этом вопросе потенциальными пользователями.
              +1
              Зачем это потребовалось именно мне. Занимаясь разработкой EmForge (система управления проектами) — целевая аудитория которого на данный момент — это team-leader-ы, project manager-ы, которые мог ли бы заинтерисоваться им и захотели бы попробовать я столкнулся с тем, что действительно далеко не все из них работают в J2EE, и готовы тратить время на разбирательство куда надо засунуть этот *.war что бы это заработало. Вот для таких случаев очень сильно пригодился msi — и как показывает статистика на SourceForge — больше половины закачек — именно msi а не war — значит все-таки надо.

              Ну а если еще кому-нибудь пригодится — то и хорошо :)
                0
                У каждого Web-контейнера есть «админка», используя которую администратор сервера приложений может указать путь к WAR-файлу, загрузить его на сервер и запустить на нём. Никакие другие непривелегированные пользователи деплоинг JEE-приложения делать не должны — это противоречит самой системе безопасности Java.

                И процесс развёртывания явно специфицированный и не привязан к конкретной платформе (Windows, Unix, etc.).

                Вы же предлагаете:
                1) обеспечить любому пользователю с административными правами в системе инсталлировать приложения, которые к Windows по сути не имеют никакого отношения (выполняются в контейнере и могут мигрировать по сети на другие сервера, отличные от Windows)
                — администратор ОС не то же самое, что администратор сервера! — запомните это.

                2) привязать JEE-приложение к конкретной операционной среде Windows, что не является правильным и противоречит принципам Java «WORA»
                — мобильность и кластеризуемость JEE-приложений под угрозой.
                  +1
                  1) С чего Вы взяли, что в сети уже установлен сервер приложений? Компания просто желает поставить веб-решение для управлением проектом. Если у них нет в сети ни одного сервера приложений, почему бы не предоставить один файл, с инструкцией из одного пункта, избавив от ненужных терминов

                  2) Опять же, разве кто-то запретил скачивать WAR?

                  Инсталятор — это средство для популяризации проекта. Увидив знакомый msi — намного больше народу захотят это попробовать.
                    0
                    Все правильно. Для того эе EmForge — msi с Windows Installer-ом, zip — с Jetty-bundled решением и WAR — для деплоя на уже установленный сервер лежат рядом — каждый выбирает что ему лучше подходит.

                    Понятное дело — что если у кого-то уже стоит какой-либо сервер приложений — понятно что такому пользователю будет удобней скачать вар и задеплоить его — вместо того что бы заводить еще один сервис. Но практика показывает — значительно больше людей у которых никакого сервера нет — а их интерисует именно продукт (а не технология, на которой он написан)
                0
                Спасибо за статью, ждем второй части
                  0
                  Можно ли в установке сконфигурировать сервер/приложение? Например порт jetty, пути к базе,…
                    +1
                    Об этом следующей части — но пока нет — порт по умолчанию, база — встроенный HSQL. Все это можно сделать — но надо глубже копать в WiX.

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

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