В этой статье рассматривается использование популярного инструмента ant для развертывания Java приложений в Windows Azure:
- Windows Azure Starter Kit for Java
- Выбор реализации скрипта старта
- Добавление пакета JDK.zip в approot
- Добавление пакета с java-сервером в approot
- Подготовка Java приложения
- Сборка и тестирование в эмуляторе Windows Azure
- Изменения в проекте для выкладывания в Windows Azure
- Выкладывание проекта в 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) или Apache Ant 101: Моментальная компоновка Java-программ ). В статье описывается использование эмулятора Windows Azure — установить его можно в разделе Загрузки сайта Windows Azure ( ссылка «Эмуляторы» ), в качестве дополнительной информации можно посмотреть Windows Azure Emulators On Your Desktop
Windows Azure Starter Kit for Java
В разделе Downloads находится ссылка на ZIP файл внутри которого содержится шаблон проекта — для начала работы достаточно просто распаковать содержимое архива. Помимо стандартных для Java компонент внутри проекта имеется несколько файлов облегчающих работу с Windows Azure.
Ключевые элементы шаблона проекта
Файл |
Описание |
.cspack.jar | Реализация ant задачи windowsazurepackage |
ServiceConfiguration.cscfg | Конфигурационный файл сервиса Windows Azure |
ServiceDefinition.csdef | Файл настройки сервиса Windows Azure |
package.xml | Конфигурационный файл ( скрипт ) для ant |
WorkerRole1approotHelloWorld.war | Простой пример реализации upload. |
WorkerRole1approotstartup.cmd | Этот скрипт старта ( batch файл ) запускается каждый раз при старте процесса выкладывания. В этом файле необходимо реализовать все действия которые необходимо сделать при старте экземпляра WindowsAzure — такие как установка и конфигурирование отдельных компонент, например установка и старт сервера приложений Java. |
samples | Внутри этой директории содержаться примеры установки и настройки популярных серверов приложений Java ( Tomcat, JBoss, GlassFish, Jetty и тд ) — эти примеры могут быть использованы для создания нужной реализации startup.cmd. |
WorkerRole1approotrun.cmd | Этот скрипт ( batch файл ) запускается каждый раз после того как процедура выкладывания стартует. Предполагается что этот скрипт выполняется все время пока приложение находится в рабочем состоянии. В случае если произошел выход из этого скрипта Azure полагает что данные экземпляр необходимо рестартовать. В шаблоне реализован пример run.cmd в котором можно увидить вызов другого скрипта — utilwhileproc.cmd с параметром java.exe Скрипт whileproc.cmd ( находится в WorkerRole1approotutil ) каждые 15 секунд проверяет проверку на то что процесс java.exe запущен. |
WorkerRole1approotutil unzip.vbs | Скрипт ( visual basic script ) реализует распаковку zip архивов — этот скрипт полезен при реализации startup.cmd в случаях когда может понадобиться распаковка zip архивов. |
WorkerRole1approotutil download.vbs | Скрипт ( visual basic script ) реализует загрузку указанного URL в папку approot. Этот скрипт может быть очень полезен при реализации startup.cmd в случаях когда необходимо скачать какие либо данные — это может быть скачивание дистрибутива большого размера ( для того чтобы не включать этот дистрибутив в пакет нашего приложения для Windows Azure ), например дистрибутива Java сервера. Ccылка ( URL ) может указывать на любой ресурс который не требует аутентификации ( в том числе это могут быть и данные размещенные в блобах с анонимным доступом — см. Restricting Access to Containers and Blobs ) либо такие ссылки в которых вся информация необходимая для авторизации содержится в самой ссылке URL ( например это могут быть блобы с включенной shared access signature ). |
certSampleRemoteAccessPrivate.pfx | Пример приватного ключа с сертификатом который можно загрузить через веб-портал Windows Azure для того чтобы разрешить доступ через Remote Desktop к запущенному экземпляру Windows Azure — см Remote Desktop или Microsoft Windows Azure. Быстрый старт. Часть 4. Внутри виртуальной машины Windows Azure |
certSampleRemoteAccessPublic.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:
Добавление пакета с 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 ) :
Следующий шаг это установка правильного значения для переменной 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 будут следующие:
- Создайте WAR файл с приложением ( например MyWebApp.war ).
- Скопируйте этот WAR файл в approot ( этот шаг можно добавить в процедуру создания WAR файлов )
- В скрипте старта startup.cmd модифицируйте переменную WAR_NAME соответствующим образом — в нашем случае WAR_NAME=MyWebApp.war
Также как и с SERVER_DIR_NAME будьте аккуратны и проверьте что после = и в конце строки ( после .war ) нет никаких пробелов. Cодержимое approot должно выглядеть следующим образом :
Сборка и тестирование в эмуляторе Windows Azure
Откройте командную строку Windows, перейдите в папку где находится проект и выполните ant:
ant -buildfile package.xml
Эта команда сообщает ant использовать информацию из package.xml для сборки приложения. Процесс сборки может занять некоторое время и быть достаточно продолжительным, в завимимости от размера приложения и производительности компьютера. В случае если сборка завершилась успешно Вы увидете в окне с командной строкой сообщение о том что "BUILD SUCCESSFUL", это может выглядеть например так :
По умолчанию проект сконфигурирован для локального выкладывания в эмулятор ( настройка задается параметром 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 — это можно проверить открыв в веб-браузере ссылку http://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 под своим логин/паролем и делаете два простых шага:
- Загрузка PFX сертификатов ( в случае этого не было сделано раньше ). Этот шаг требуется для того чтобы сделать возможным удаленный доступ к запущенным виртуальным машинам в облаке Windows Azure через Remote Desktop — удаленный доступ полезен при разработке, отладке и тестировании приложений в Windows Azure — более подробно см Remote Desktop или Microsoft Windows Azure. Быстрый старт. Часть 4. Внутри виртуальной машины Windows Azure
- Создаем новое развертывание ( deployment ) и загружаем .cspkg и .cscfg файлы которые были созданы в процессе сборки приложения для Azure.
После выполнения этих шагов приложение должно успешно развернуться и запуститься в облаке Windows Azure. Дополнительную информацию по развертыванию в Windows Azure можно посмотреть в Microsoft Windows Azure. Быстрый старт и Microsoft Windows Azure. Быстрый старт. Часть 2. В следующих статьях мы рассмотрим использование удаленного доступа через Remote Desktop для работы с Java приложениями в Windows Azure, а также более подробно остановимся на использовании файлов конфигурации .cscfg и .csdef.
Полезные ссылки
- Сайт Windows Azure
- Электронная книга Windows Azure – облачная платформа Microsoft
- 24 статьи про Windows Azure на русском языке
- Центр разработки Windows Azure
- Microsoft Windows Azure. Быстрый старт
Автор: abokov