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:
Отправить комментарий