Что вызывает ошибку "Не удалось найти класс обслуживания" для службы, обернутой WinRun4j
[info] Имя модуля: C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ src \ com \ service \ wrapper \ ServiceWrapper.exe
[info] Модуль INI: C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ src \ com \ service \ wrapper \ ServiceWrapper.ini
[info] Модуль Dir: C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ src \ com \ service \ wrapper \
[info] INI Dir: C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ src \ com \ service \ wrapper \
[info] Рабочий каталог: C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ src \ com \ service \ wrapper
[info] Настроил vm.location:
[info] Найдено VM: C: \ Program Files (x86) \ Java \ jre7 \ bin \ client \ jvm.dll
[info] Расширение пути к классам: C:\Users\ User \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ build \ classes \
[info] Расширение пути к классам: C:\Users\ User \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ dist \ lib\WinRun4J.jar
[info] Сгенерированный путь к классу: C:\Users\ User \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ dist \ lib\WinRun4J.jar
[информация] В.М. Аргс:
[info] vmarg.0 = -Djava.class.path = C: \ Users \ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ dist \ lib\WinRun4J.jar
[info] Регистрация аборигенов для родного класса
[info] Регистрация аборигенов для класса FFI
[err] Не удалось найти класс обслуживания
[err] Не удалось инициализировать службу: 1
java.lang.NoClassDefFoundError: com / service / wrapper / ServiceWrapper / class Причина: java.lang.ClassNotFoundException: com.service.wrapper.ServiceWrapper. учебный класс
at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)
Это service.ini, который я написал для этой оболочки...
service.class = com.service.wrapper.ServiceWrapper service.id = Service_Simulation service.name = Windows_Java_Wrapped_Service service.description = Это пример для Java Service service.startup = "boot" main.class = com.service.wrapper.ServiceWrapper
classpath.1 = C: \ Users \ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\build\classes\ classpath.2=C:\Users\ Пользователь \Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\ расстояние \ Lib\WinRun4J.jar
что я скучаю...
1 ответ
Я считаю, что вы используете два несовместимых параметра в вашем service.ini. Вы должны представить либо service.class
или же main.class
, но не оба.
Если вы хотите, чтобы ваш.exe всегда выполнялся как служба, вы должны использовать service.class
и зарегистрируйте его в диспетчере служб Windows, вот так:
executable.exe --WinRun4J:RegisterService
Если вы хотите, чтобы это было обычное приложение, вы должны использовать main.class
и назови это нормально.
Если вы хотите выполнить его обоими способами, вы должны вернуться к какой-то кольцевой развязке, такой как здесь. CopyPasting по ссылке:
У меня такое же требование, для того, что будет около 10 или около того услуг. Каждый из них также должен быть доступен для поддержки людей для выполнения командной строки, передавая необязательные параметры для режима "одиночного запуска".
Я просто создал пару INI-файлов для каждой копии исполняемого файла службы, которая представляет каждую службу. Каждый ini-файл службы идентичен своему партнеру командной строки, за исключением следующего заголовка, при этом части службы / командной строки комментируются соответствующим образом:
working.directory=.
service.class=com.xgs.cfs.services.ServiceControl
service.id=service_id service.name=Windows Service Name
service.description=Service Description
#command line app configuration
#main.class=com.xgs.cfs.services.ServiceControl
#console.title=process name
#singleinstance=process
Служба запускается из Windows SCM, а при запуске из командной строки используется следующая команда из командного файла, хранящегося в более удобном для пользователя месте:
%deploymentroot%/svc_bin/service_name_svc.exe --WinRun4J:ExecuteINI %deploymentroot%/svc_bin/service_name_exe.ini
(
%deploymentroot%
переменная среды, используемая в проекте для управления путями.)Приведенная выше пакетная команда является ключевой здесь, так как она говорит оболочке winrun4j использовать inin-файл, отличный от имени исполняемого файла по умолчанию. Служба заберет имя по умолчанию (service_name_svc.ini) из папки двоичных файлов службы.
Класс com.xgs.cfs.services.ServiceControl написан так, что он не имеет зависимостей от обратных вызовов управления службами для операции (т. Е. Он запускается автоматически, и все необходимые нормальные выключения выполняются с помощью ловушек Java shut down, делающих весь лот как Ctrl-C безопасно, как это возможно.). Вы можете просто изменить класс запуска, если это необходимо, хотя я посчитал это ненужным.