0

运行由 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

我错过了什么?

4

1 回答 1

0

我相信您在 service.ini 中使用了两个不兼容的参数。您必须介绍其中一个service.classmain.class,但不能同时介绍两者。

如果您希望您的 .exe 始终作为服务执行,您必须service.class在 Windows 服务管理器中使用并注册它,如下所示:

executable.exe --WinRun4J:RegisterService

如果你想让它成为一个普通的应用程序,你必须正常使用main.class和调用它。

如果您想以两种方式执行它,则必须退回到类似于此处的回旋处。从链接复制粘贴:

我也有同样的要求,大约需要 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 尽可能安全。)。如果需要,您可以简单地更改启动类,尽管我发现它没有必要。

于 2014-05-13T12:18:22.867 回答