导致WinRun4j包装的服务显示“找不到服务类”的错误的原因

问题描述 投票:0回答:1

运行WinRun4J包装的jar时出现以下错误:

[info] Module Name: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\src\com\service\wrapper\ServiceWrapper.exe
[info] Module INI: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\src\com\service\wrapper\ServiceWrapper.ini
[info] Module Dir: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\src\com\service\wrapper\
[info] INI Dir: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\src\com\service\wrapper\
[info] Working directory set to: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\src\com\service\wrapper
[info] Configured vm.location:
[info] Found VM: C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll
[info] Expanding Classpath: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\build\classes\
[info] Expanding Classpath: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\dist\lib\WinRun4J.jar
[info] Generated Classpath: C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\dist\lib\WinRun4J.jar
[info] VM Args:
[info] vmarg.0=-Djava.class.path=C:\Users\User\Documents\NetBeansProjects\NETBEANS 
6.9.1\Desktop_apps\Test2\dist\lib\WinRun4J.jar
[info] Registering natives for Native class
[info] Registering natives for FFI class
 [err] Could not find service class
 [err] Failed to initialise service: 1
java.lang.NoClassDefFoundError: com/service/wrapper/ServiceWrapper/class
Caused by: java.lang.ClassNotFoundException: com.service.wrapper.ServiceWrapper.
class
        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=This is an Example for Java Service
service.startup="boot"
main.class=com.service.wrapper.ServiceWrapper
classpath.1=C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\build\classes\
classpath.2=C:\Users\User\Documents\NetBeansProjects\NETBEANS 6.9.1\Desktop_apps\Test2\dist\lib\WinRun4J.jar

我想念什么?

java windows service wrapper winrun4j
1个回答
0
投票

我相信您在service.ini中使用了两个不兼容的参数。您必须引入service.classmain.class,但不能两者都引入。

如果您希望始终将.exe作为服务执行,则必须使用service.class并将其注册到Windows Service Manager中,如下所示:

executable.exe --WinRun4J:RegisterService

如果要使其成为普通应用程序,则必须使用main.class并正常调用它。

如果要以两种方式执行它,则必须像here那样回落到一些环形交叉路口。从链接复制粘贴:

我有相同的要求,大约是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关闭钩子完成,使得整个过程像ctrl-c尽可能安全。)。您可以简单地更改启动类,如果需要,尽管我发现它没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.