Недавно, в силу обстоятельств, пришлось решать достаточно непривычную для себя задачу - настраивать 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
сгенерировала нам кучу вспомогательных файлов:

Среди них особенно интересен первый файл - некий конфиг в формате 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
Открываем виндовую панель управления службами и кликаем "запустить" по нашему домену. Вроде запустилось:

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

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

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