How to: запуск jar-ника фоновым процессом в win7
Иногда необходимо чтобы запущенная программа просто висела фоном, в виде службы виндовс. Делается это довольно просто с помощью библиотеки Java Service Wrapper.
Важный нюанс: для этого способа необходимо иметь права админа в системе.
Запускается простой http сервер, с одним сервисом, возвращающим строку по урлу http://localhost:9009/rest/say.
Есть несколько способов интергации Java Service Wrapper. Один из них реализация интерфейса WrapperListener. Об этом подробнее тут.
Интерфейс WrapperListener и прочие нужные классы лежат в wrapper.jar - этот jar-ник необходимо включить в зависимости проекта, а сам он лежит в папке lib всего архива wrapper, который скачивается тут.
Главный класс приобретает следующий вид:
Добавлены методы реализация интерфейса и немного поменялся запуск. Причем jar-ник по-прежнему запускается обычном способом из ide. На этом изменения проекта заканчиваются.
Далее иду в 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 указывает на файл конфигурации. Сейчас там:
Меняю на
Теперь дело за редактированием wrapper.conf. Что же в нем есть интересного.
Мои настройки
Не забываю скопировать мои jar-ники в папку bin
Приложение запускается значит все хорошо, нужные классы и библиотеки найдены. Можно прервать Ctrl+C, или дождаться пока завершится.
И, наконец, установка сервиса:
>InstallService
И что же мы видим в диспетчере задач. А все очень даже неплохо, сервис появился в списке:
Все еще не запущен. Сделаю же это: StartService
В диспетчере теперь:
И сам сервис на странице:
Оставшиеся команды для возврата в исходное состояние
>StopService
>UninstallService.bat
Итого. Прекрасный функциональный способ запуска фоновых служб. Который, однако, требует наличия прав администратора.
Ссылки.
Исходники сего действа svn.
Эта замечательная вещь Java Service Wrapper
Дельный и подробный пример запуска часть 1, часть 2, часть 3
Важный нюанс: для этого способа необходимо иметь права админа в системе.
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
Вот что остается в итоге:
Ничего лишнего |
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Пробный запуск |
И, наконец, установка сервиса:
>InstallService
Установка сервиса |
И что же мы видим в диспетчере задач. А все очень даже неплохо, сервис появился в списке:
Вот где он! |
Теперь сервис запущен. |
Всеработает. |
Функционирует в фоновом режиме. |
>StopService
>UninstallService.bat
Итого. Прекрасный функциональный способ запуска фоновых служб. Который, однако, требует наличия прав администратора.
Ссылки.
Исходники сего действа svn.
Эта замечательная вещь Java Service Wrapper
Дельный и подробный пример запуска часть 1, часть 2, часть 3
0 comments:
Отправить комментарий