About

2 янв. 2014 г.

How to: запуск jar-ника фоновым процессом в win7




Иногда необходимо чтобы запущенная программа просто висела фоном, в виде службы виндовс. Делается это довольно просто с помощью библиотеки Java Service Wrapper.
Важный нюанс: для этого способа необходимо иметь права админа в системе.
1. Подготовка проекта
2. Кофигурация
3. Запуск.


1. Подготовка проекта

Есть jar-ник с REST сервисом который нужно запустить в фоне. Главный класс:
public class App 
{
    private static final String HOST = "localhost";
    private static final int PORT = 9009;
    
    public static void main( String[] args )
    {
       
        URI uri = getURI();
        ResourceConfig rc = getRc();
        JdkHttpServerFactory.createHttpServer(uri, rc);
        System.out.println("Server start! Try " +uri);
    }
    
    private static URI getURI(){
        return UriBuilder.fromUri("http://"+HOST+"/rest")
                .port(PORT).build();
    }
    
    private static ResourceConfig getRc(){
         ResourceConfig rc = new ResourceConfig();
         rc.packages("com.str.httpconsoleservice.service");
         return rc;
    }
}

Запускается простой http сервер, с одним сервисом, возвращающим строку по урлу http://localhost:9009/rest/say.
Есть несколько способов интергации Java Service Wrapper. Один из них реализация интерфейса WrapperListener. Об этом подробнее тут.
Интерфейс WrapperListener и прочие нужные классы лежат в wrapper.jar - этот jar-ник необходимо включить в зависимости проекта, а сам он лежит в папке lib всего архива wrapper, который скачивается тут
Главный класс приобретает следующий вид:
public class App implements WrapperListener {

    private static final String HOST = "localhost";
    private static final int PORT = 9009;

    public static void main(String[] args) {
        WrapperManager.start(new App(), args);

    }

    @Override
    public Integer start(String[] strings) {
        URI uri = getURI();
        ResourceConfig rc = getRc();
        JdkHttpServerFactory.createHttpServer(uri, rc);
        System.out.println("Server start! Try " + uri);
        return null;
    }

    @Override
    public int stop(int i) {
        return 0;
    }

    @Override
    public void controlEvent(int e) {
        if ((e == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT)
                && (WrapperManager.isLaunchedAsService() ||  
WrapperManager.isIgnoreUserLogoffs())) {
                //Ignore
        } else {
            WrapperManager.stop(0);
        }
    }

    private static URI getURI() {
        return UriBuilder.fromUri("http://" + HOST + "/rest")
                .port(PORT).build();
    }

    private static ResourceConfig getRc() {
        ResourceConfig rc = new ResourceConfig();
        rc.packages("com.str.httpconsoleservice.service");
        return rc;
    }
}

Добавлены методы реализация интерфейса и немного поменялся запуск. Причем jar-ник по-прежнему запускается обычном способом из ide. На этом изменения проекта заканчиваются.

2. Конфигурация

Скачиваю для своей системы Java Service Wrapper, распаковываю, получаю такой списочек
wrapper-windows-x86-64-3.5.23-st

Далее иду в bin, там следующие файлы:
Множество файлов для управления запуском демо приложения
Тут успешно запускается тестовый пример. Но мне нужен свой. Переименовываю для удобства некоторые файлы.

DemoApp.bat –> Run.bat
InstallTestWrapper-NT.bat –> InstallService.bat
PauseTestWrapper-NT.bat –> deleted
QueryTestWrapper-NT.bat –> deleted
ResumeTestWrapper-NT.bat –> deleted
StartTestWrapper-NT.bat –> StartService.bat
StopTestWrapper-NT.bat –> StopService.bat
UninstallTestWrapper-NT.bat –> UninstallService.bat
Вот что остается в итоге:
Ничего лишнего
 Теперь редактирование. В файле Run.bat переменная _WRAPPER_CONF_DEFAULT указывает на файл конфигурации. Сейчас там:

set _WRAPPER_CONF_DEFAULT=../conf/demoapp.conf

Меняю на

set _WRAPPER_CONF_DEFAULT=../conf/wrapper.conf

Теперь дело за редактированием wrapper.conf.  Что же в нем есть интересного.
  • wrapper.java.mainclass  главные класс моего jar-ника.
  • wrapper.java.classpath.1..n jar-ники которые необходимо добавить в classpath, а так же главный запускаемый архив. !!! Путь указывается относительно папки bin (!!!)
  • wrapper.name  имя сервиса
  • wrapper.displayname отображаемое имя сервиса
  • wrapper.description описание
  • wrapper.ntservice.starttype тип запуска. AUTO_START автозапуск при загрузке системы, DELAY_START старт при входе в систему, DEMAND_START явный запуск сервиса.
  • и еще множество фич.

Мои настройки
wrapper.java.mainclass=com.str.httpconsoleservice.App

wrapper.java.classpath.3=./lib/*
wrapper.java.classpath.4=HttpConsoleService-1.0.jar

wrapper.name=StrHttpService

wrapper.displayname=Small Http Service

wrapper.description='RESTful WS. Test http://localhost:9009/rest/say'

wrapper.ntservice.starttype=DEMAND_START

Не забываю скопировать мои jar-ники в папку bin
Мой jar-ник и его зависимости.

3.Запуск

Открываю консоль с админ правами. Запускаю: Run 
Пробный запуск
Приложение запускается значит все хорошо, нужные классы и библиотеки найдены. Можно прервать Ctrl+C, или дождаться пока завершится.
И, наконец, установка сервиса:
>InstallService
Установка сервиса

 И что же мы видим в диспетчере задач. А все очень даже неплохо, сервис появился в списке:
Вот где он!

Все еще не запущен. Сделаю же это: StartService
Теперь сервис запущен.
В диспетчере теперь:
Всеработает.
 И сам сервис на странице:
Функционирует в фоновом режиме.
Оставшиеся команды для возврата в исходное состояние
>StopService
>UninstallService.bat

Итого. Прекрасный функциональный способ запуска фоновых служб. Который, однако, требует наличия прав администратора.

Ссылки.
Исходники сего действа svn.
Эта замечательная вещь Java Service Wrapper
Дельный и подробный пример запуска часть 1, часть 2, часть 3

0 comments:

Отправить комментарий