簡體   English   中英

是什么原因導致 WinRun4j 包裝的服務出現“找不到服務類”的錯誤

[英]What causes the error that says "Could not find the Service Class" for a service wrapped by WinRun4j

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

我錯過了什么?

我相信您在 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 盡可能安全。)。 如果需要,您可以簡單地更改啟動類,盡管我發現它沒有必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM