Развертывание Java приложений в Windows Azure при помощи ant

Windows Azure + apache ant + java

В этой статье рассматривается использование популярного инструмента ant:

  • Сборка Java приложений для Windows Azure с помощью ant
  • Выкладывание собранных пакетов в Windows Azure и использование локального эмулятора

Перед началом работы рекомендуется ознакомиться с общей информацией о Windows Azure — Электронная книга Windows Azure – облачная платформа Microsoft и 24 статьи про Windows Azure на русском языке. Для работы с Java приложениями в Windows Azure мы будем использовать Windows Azure Starter Kit for Java ( для пользователей Eclipse есть плагин Windows Azure Plugin for Eclipse ). Windows Azure Starter Kit for Java использует Apache Ant в качестве инструмента в процессе сборки — документация по нему доступна здесь: Apache Ant manual (есть доступные материалы и на русском языке: Ant за 10 шагов (make ant java)). В статье описывается использование эмулятора Windows Azure — установить его можно в разделе Загрузки сайта Windows Azure ( ссылка «Эмуляторы» ), в качестве дополнительной информации можно посмотреть Windows Azure Emulators On Your Desktop

Windows Azure Starter Kit for Java

В разделе Downloads находится ссылка на ZIP файл внутри которого содержится шаблон проекта — для начала работы достаточно просто распаковать содержимое архива. Помимо стандартных для Java компонент внутри проекта имеется несколько файлов облегчающих работу с Windows Azure.

Windows Azure Starter Kit for Java

Ключевые элементы шаблона проекта

Файл Описание
.cspack.jar Реализация ant задачи windowsazurepackage
ServiceConfiguration.cscfg Конфигурационный файл сервиса Windows Azure
ServiceDefinition.csdef Файл настройки сервиса Windows Azure
package.xml Конфигурационный файл ( скрипт ) для ant
WorkerRole1\approot\HelloWorld.war Простой пример реализации upload.
WorkerRole1\approot\startup.cmd Этот скрипт старта ( batch файл ) запускается каждый раз при старте процесса выкладывания. В этом файле необходимо реализовать все действия которые необходимо сделать при старте экземпляра WindowsAzure — такие как установка и конфигурирование отдельных компонент, например установка и старт сервера приложений Java.
samples Внутри этой директории содержаться примеры установки и настройки популярных серверов приложений Java ( Tomcat, JBoss, GlassFish, Jetty и тд ) — эти примеры могут быть использованы для создания нужной реализации startup.cmd.
WorkerRole1\approot\run.cmd Этот скрипт ( batch файл ) запускается каждый раз после того как процедура выкладывания стартует. Предполагается что этот скрипт выполняется все время пока приложение находится в рабочем состоянии. В случае если произошел выход из этого скрипта Azure полагает что данные экземпляр необходимо рестартовать. В шаблоне реализован пример run.cmd в котором можно увидить вызов другого скрипта — util\whileproc.cmd с параметром java.exe Скрипт whileproc.cmd ( находится в WorkerRole1\approot\util ) каждые 15 секунд проверяет проверку на то что процесс java.exe запущен.
WorkerRole1\approot\util unzip.vbs Скрипт ( visual basic script ) реализует распаковку zip архивов — этот скрипт полезен при реализации startup.cmd в случаях когда может понадобиться распаковка zip архивов.
WorkerRole1\approot\util download.vbs Скрипт ( visual basic script ) реализует загрузку указанного URL в папку approot. Этот скрипт может быть очень полезен при реализации startup.cmd в случаях когда необходимо скачать какие либо данные — это может быть скачивание дистрибутива большого размера ( для того чтобы не включать этот дистрибутив в пакет нашего приложения для Windows Azure ), например дистрибутива Java сервера. Ccылка ( URL ) может указывать на любой ресурс который не требует аутентификации ( в том числе это могут быть и данные размещенные в блобах с анонимным доступом — см. Restricting Access to Containers and Blobs ) либо такие ссылки в которых вся информация необходимая для авторизации содержится в самой ссылке URL ( например это могут быть блобы с включенной shared access signature ).
cert\SampleRemoteAccessPrivate.pfx Пример приватного ключа с сертификатом который можно загрузить через веб-портал Windows Azure для того чтобы разрешить доступ через Remote Desktop к запущенному экземпляру Windows Azure — см Remote Desktop или Microsoft Windows Azure. Быстрый старт. Часть 4. Внутри виртуальной машины Windows Azure
cert\SampleRemoteAccessPublic.cer Пример публичного ключа с сертификатом — этот ключ должен быть использован в паре с приватным ключом для получения доступа через Remote Desktop — более подробно см. Remote Desktop или Microsoft Windows Azure. Быстрый старт. Часть 4. Внутри виртуальной машины Windows Azure

Выбор реализации скрипта старта

Шаблон проекта позволяет использовать различные серверы приложений Java: Tomcat, Jetty, JBoss и GlassFish ( использование с другими серверами приложений тоже возможно, но с некоторыми изменениями настроек ). Для конфигурирования шаблона для определённого Java-сервера необходимо взять соответствующий скрипт старта ( они находятся в папке samples ) и скопировать содержимое этого скрипта в скрипт startup.cmd ( полностью заменив таким образом его содержимое ). Далее, при необходимости внести какие-либо изменения в скрипт старта рекомендуется сразу вносить их в startup.cmd

Добавление пакета JDK.zip в approot

Для примера мы будем рассматривать использование JDK v1.6 от Sun Oracle, но в целом, так же как и с Java-сервером, у нас есть свобода выбора другого JDK. Отмечу, что поскольку платформа Windows Azure в части вычислительных ресурсов является 64 битной, то необходимо использование 64 битной версии JDK и соответствующей версии Java сервера. Это в том числе означает что для использования 64 битного JDK и разработки/тестирования в эмуляторе Windows Azure на том компьютере на котором Вы будете заниматься разработкой нужна 64 битная Windows. Для начала проинсталлируйте выбранный JDK на компьютер, затем запакуйте папку с JDK в файл JDK.zip таким образом чтобы внутри архива была одна папка с названием JDK и все содержимое проинсталлированного JDK ( в том числе и JRE ) было внутри этой папки ( см. также Where can I get the latest JRE / JDK as a zip file ). После того как jdk.zip создан его необходимо скопировать в approot:

jdk.zip в структуре проекта

Добавление пакета с java-сервером в approot

Следующий шаг это добавление в approot выбранного сервера приложений Java — чтобы минимизировать изменения в скрипте старта рекомендуется использовать имена используемые по умолчанию. В зависимости от выбранного сервера переименуйте упакованный архив в ZIP c Java сервером в соответствии с таблицей

Cервер Имя файла
Apache Tomcat 7.x tomcat7.zip
GlassFish Server OSE 3.x glassfish3.zip
JBoss Application Server 6.x jboss6.zip
JBoss Application Server 7.x jboss7.zip
Jetty 7.x jetty7.zip

Затем скопируйте этот ZIP файл в approot ( для примера тут взят tomcat7.zip ) :
tomcat7 в структуре проекта


Следующий шаг это установка правильного значения для переменной SERVER_DIR_NAME в скрипте старта — переменная должна указывать на директорию в которую Java сервер будет распакован. Как правило, достаточно установить ее равным имени папки с Java сервером внутри ZIP файла. Причина по которой имя папки для распаковки Java сервера лучше всего выбирать равным имени папки внутри ZIP заключается в том что, как правило, разные релизы Java сервером имеют сильную связь между версией и именем директории. Примеры в samples содержат значения которые возможно уже не являются актуальными и не соответствуют последним релизам Java серверов, поэтому рекомендуется обновить значение SERVER_DIR_NAME в соответствии с используемой версией. Например, в примере для Apache Tomcat ( файл samples/startupApacheTomcat7.txt ) для значения этой переменной берется значение SET SERVER_DIR_NAME=apache-tomcat-7.0.22. Вполне вероятно что к моменту когда вы читаете этот документ версия 7.0.22 будет уже не последней, и соответственно вы будете использовать новую версию ( например 7.0.29 ), поэтому не забудьте соответствующим образом обновить значение переменной SERVER_DIR_NAME ( в данном случае на SERVER_DIR_NAME=apache-tomcat-7.0.29 ). Если этого не сделать весьма вероятно то что приложение не сможет даже корректно развернуться на запущенном экземпляре. Также хочется отметить что частым источником ошибок является использование лишних ( и незаметных ) пробелов при инициализации этой переменной — пожалуйста имейте в виду что строка инициализации должна выглядеть следующим образом ( без двойных кавычек ) "SET SERVER_DIR_NAME=apache-tomcat-7.0.29" и после знака =, как и после окончания строки инициализации ( после символа 9 в данном случае ) не должно быть пробелов.После этого шага Вы уже можете попробовать выполнить сборку и запустить этот проект в локальном эмуляторе Windows Azure — вы должны увидеть что Java сервер запускается, а приложение HelloWorld разворачивается корректно. Приложение HelloWorld входит в шаблон по умолчанию — Вы можете увидеть его в approot, значение WAR_NAME в скрипте старта также указывает на это приложение. После того как Вы попробовали запустить Java сервер и развернуть приложение "Hello World" можно приступать к следующим шагам — если не планируется подключать другое Java приложение, то можно пропустить следующий раздел и перейти сразу к сборке и тестированию приложения.

Подготовка Java приложения

Для начала я хотел бы еще раз обратить внимание на то что проекты в Windows Azure являются проектами выкладывания ( deployment ), а не проектами программирования на Java ( более того в проекте Windows Azure может вообще не содержаться Java кода ). То есть предполагается что уже есть уже Java приложение, которое Вы разрабатываете и есть возможность создать WAR файл который содержит приложение. Тогда шаги по включению приложения в проект Windows Azure будут следующие:

  1. Создайте WAR файл с приложением ( например MyWebApp.war ).
  2. Скопируйте этот WAR файл в approot ( этот шаг можно добавить в процедуру создания WAR файлов )
  3. В скрипте старта startup.cmd модифицируйте переменную WAR_NAME соответствующим образом — в нашем случае WAR_NAME=MyWebApp.war

Также как и с SERVER_DIR_NAME будьте аккуратны и проверьте что после = и в конце строки ( после .war ) нет никаких пробелов. Cодержимое approot должно выглядеть следующим образом :

MyWebApp.war в структуре проекта


Сборка и тестирование в эмуляторе Windows Azure

Откройте командную строку Windows, перейдите в папку где находится проект и выполните ant:
ant -buildfile package.xml

Эта команда сообщает ant использовать информацию из package.xml для сборки приложения. Процесс сборки может занять некоторое время и быть достаточно продолжительным, в завимимости от размера приложения и производительности компьютера. В случае если сборка завершилась успешно Вы увидете в окне с командной строкой сообщение о том что "BUILD SUCCESSFUL", это может выглядеть например так :

пример успешной сборки проекта Windows Azure для ant


По умолчанию проект сконфигурирован для локального выкладывания в эмулятор ( настройка задается параметром packagetype в файле package.xml — по умолчанию packagetype="local" ). Папка с именем "emulatorTools" создается сразу после папки "deploy" во время сборки проекта. Папка "emulatorFolder" содержит два скрипт ( batch файла ) которые позволяют более удобно работать с эмулятором Windows Azure — выкладывать проект, перезагружать сервис, запускать его :

  • RunInEmulator.cmd — этот скрипт стартует эмулятор облачной среды Windows Azure на локальном компьютере и выкладывает проект в эту среду. В случае если в проекте используется хранилище и вы планируете использовать эмулятор хранилища Windows Azure Вам необходимо отдельно запустить эмулятор Azure Storage.
  • ResetEmulator.cmd — удаляет все запущенные экземпляры приложения в локальном эмуляторе Azure Compute Emulator, разблокирует файлы которые использовал эмулятор и выключает фабрику приложений. Эту команду необходимо использовать в конце тестирования или отладки приложения.

Последним шагом является запуск сервера в эмуляторе:

cd emulatorToolsRunInEmulator

В случае если все прошло успешно приложение будет запущено на порту 8080 — это можно проверить открыв в веб-браузере ссылку https://localhost:8080/MyWebApp

Изменения в проекте для выкладывания в Windows Azure

Для того чтобы сделать проект доступным для работы в облаке Windows Azure нам необходимо сделать несколько изменений в файле package.xml. В этом файле есть специальный тэг windowsazurepackage который определяет конфигурацию выкладывания проекта в локальную или удаленную облачную среду Windows Azure.
<windowsazurepackage packagefilename="WindowsAzurePackage.cspkg" packagedir="${wapackagedir}" packagetype="local" projectdir="${basedir}" definitionfilename="ServiceDefinition.csdef" configurationfilename="ServiceConfiguration.cscfg">

Обратите внимание на аттрибут packagetype — когда значение этого аттрибута packagetype="local" то структура собранного проекта будет точно такая же как для использования в облаке Windows Azure, но сама сборка не будет упакована для загрузки, а наоборот будет подготовлена для запуска в среде эмулятора Windows Azure. Если значение аттрибута packagetype="cloud" то сборка будет архивирована как .cspkg файл — через веб-портал Windows Azure вы можете загрузить файлы .cspkg и .cscfg в облако и тем самым выложить и запустить приложение в облаке.

Выкладывание проекта в Windows Azure

Выкладывание приложения в облако Windows Azure выполняется достаточно просто — Вы заходите в портал Windows Azure под своим логин/паролем и делаете два простых шага:

  1. Загрузка PFX сертификатов ( в случае этого не было сделано раньше ). Этот шаг требуется для того чтобы сделать возможным удаленный доступ к запущенным виртуальным машинам в облаке Windows Azure через Remote Desktop — удаленный доступ полезен при разработке, отладке и тестировании приложений в Windows Azure — более подробно см Remote Desktop или Microsoft Windows Azure. Быстрый старт. Часть 4. Внутри виртуальной машины Windows Azure
  2. Создаем новое развертывание ( deployment ) и загружаем .cspkg и .cscfg файлы которые были созданы в процессе сборки приложения для Azure.

После выполнения этих шагов приложение должно успешно развернуться и запуститься в облаке Windows Azure. Дополнительную информацию по развертыванию в Windows Azure можно посмотреть в Microsoft Windows Azure. Быстрый старт и Microsoft Windows Azure. Быстрый старт. Часть 2. В следующих статьях мы рассмотрим использование удаленного доступа через Remote Desktop для работы с Java приложениями в Windows Azure, а также более подробно остановимся на использовании файлов конфигурации .cscfg и .csdef.