null

Установка GlassFish в качестве службы Windows Server 2012

Недавно, в силу обстоятельств, пришлось решать достаточно непривычную для себя задачу - настраивать Liferay Portal на площадке у заказчика, использующего в качестве серверной ОС MS Windows Server 2012. Одним из требований заказчика было настроить портал так, чтобы он запускался как служба ОС и им можно было управлять с помощью стандартной панели управления службами. Т.к. с такой задачей мне до этого сталкиваться не приходилось, по ходу её решения я несколько раз наступал на заботливо разложенные разработчиками различных программных продуктов грабли, в процессе обхода которых и родился этот небольшой HowTo.

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

Итак, у нас есть успешно установленный и работающий Liferay Portal, развёрнутый под управлением операционной системы Windows Server 2012 R2; версия JDK - 1.7.0_45. Т.к., де-факто, в службу мы "заворачиваем" не портал как таковой, а сервер приложений, на котором он "крутится", нас интересует, в первую очередь, именно сервер приложений. В нашем случае это старый-добрый GlassFish 3.1.2.2.

Помимо всего прочего, есть ещё один важный нюанс - для домене глассфиша, на котором развёрнут портал, задан недефолтный master password. Это имеет значение, т.к. этот пароль в общем случае нужно сообщать порталу каждый раз при запуске домена, причём в интерактивном режиме, с чем есть очевидные трудности при управлении доменом со стороны службы ОС.

Шаг 1: создаём службу

Тут я первый раз наступил на грабли. Почему-то (видимо, по аналогии с решением задачи в других ОС), я изначально предполагал, что эту задачу правильно решать со стороны Windows. Т.е., открыть некую админку, покликать в ней мышкой по вызываемым программам / написать скрипт запуска, и т.д., после чего сервис появится в административной панели Windows. Как выяснилось здесь всё не так, и проще всего было пойти другим путём. Разработчики глассфиша всё уже сделали за нас, и в интерфейсе утилиты asadmin присутствует команда create-service, так что для создания сервиса достаточно просто сказать в консоли:

asadmin create-service %DOMAIN_NAME%

где %DOMAIN_NAME% - имя вашего домена (в случае использования дефолтного домена domain1 этот параметр необязателен).

Смотрим на административную панель и видим, что нужный нам сервис там появился:

Домен появился в списке сервисов

Шаг 2: задаём конфигурацию домена

Собственно, если ваш домен использует дефолтную конфигурацию, и при его запуске не требуется указывать какие-либо дополнительные ключи и / или параметры, то всё должно сразу заработать. В нашем случае, как мы помним, в домене задан недефольный master password, так что шаманства на этом не заканчиваются.

Как известно, для того, чтобы у администратора была возможность запускать домен с мастер-паролем в сервисном режиме, у команды start-domain утилиты asadmin есть специальный ключ --passwordfile, позволяющий указать путь к файлу в ФС, в котором хранится искомый пароль. Т.е., команда запуска домена с мастер-паролем должна выглядеть примерно так:

asadmin start-domain --passwordfile c:\\very-secret-folder\password.txt my-domain

В случае какого-нибудь линукса тут всё прекрасно - создаём шелловый скрипт запуска домена с нужными параметрами, размещаем его где-нибудь в /etc/init.d/ и радуемся жизни. В случае Windows Server всё сильно хуже, т.к. при создании службы GlassFish генерирует бинарный исполняемый файл, который просто запускает домен, и какие-либо доп. параметры, помимо имени этого домена, у команды create-service отсутствуют. Т.е., в случае использования мастер-пароля, наш домен через сервис просто не запустится.

Тем не менее, решение у этой проблемы есть. Идём в каталог /bin домена и обнаруживаем, что, помимо самого исполняемого файла службы, команда create-service сгенерировала нам кучу вспомогательных файлов:

Содержимое каталога /bin домена

Среди них особенно интересен первый файл - некий конфиг в формате XML. Открываем его и видим примерно следующее содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Лицензия и копирайты -->
<service>
  <id>Domain1</id>
  <name>Domain1 GlassFish Server</name>
  <description>GlassFish Server</description>
  <executable>C:/glassfish3/glassfish/bin/asadmin.bat</executable>
  <logpath>C:\\glassfish3\\glassfish\\domains/domain1/bin</logpath>
  <logmode>reset</logmode>
  <depend>tcpip</depend>
  <startargument>start-domain</startargument>
  <startargument>--verbose</startargument>
  <startargument>--domaindir</startargument>
  <startargument>C:\\glassfish3\\glassfish\\domains</startargument>
  <startargument>domain1</startargument>
  <stopargument>stop-domain</stopargument>
  <stopargument>--domaindir</stopargument>
  <stopargument>C:\\glassfish3\\glassfish\\domains</stopargument>
<stopargument>domain1</stopargument>
</service>

Собственно, элементы <startargument> - именно то, что нам нужно. Немного подредактируем файл, должно получиться что-то подобное:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Лицензия и копирайты -->
<service>
  <id>domain1</id>
  <name>domain1 GlassFish Server</name>
  <description>GlassFish Server</description>
  <executable>C:/glassfish-3.1.2.2/bin/asadmin.bat</executable>
  <logpath>C:\\glassfish-3.1.2.2\\domains/domain1/bin</logpath>
  <logmode>reset</logmode>
  <depend>tcpip</depend>
  <startargument>start-domain</startargument>
  <startargument>--verbose</startargument>
  <startargument>--domaindir</startargument>
  <startargument>C:\\glassfish-3.1.2.2\\domains</startargument>
  <startargument>--passwordfile</startargument>
  <startargument>C:\\very-secret-folder\\password.txt</startargument>
  <startargument>domain1</startargument>
  <stopargument>stop-domain</stopargument>
  <stopargument>--domaindir</stopargument>
  <stopargument>C:\\glassfish-3.1.2.2\\domains</stopargument>
  <stopargument>domain1</stopargument>
</service>

Сохраняем изменения и закрываем файл.

Шаг 3: запускаем домен через службу Windows

Открываем виндовую панель управления службами и кликаем "запустить" по нашему домену. Вроде запустилось:

Windows считает, что служба запустилась

Проверяем по логам, похоже на то:

Судя по логам, домен запустился

Наконец, проверяем в браузере:

Открываем домен в браузере

Ура! Всё работает!

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.