最近開發了個java程序,打成 jar 包想要在windows后台運行,於是使用JavaService.exe進行windows服務注冊,服務注冊很成功,但是在啟動時顯示“服務無法啟動”,為此耗費了大量的時間與精力,終於發現問題所在,特此記錄。
為了排除各種干擾因素,專門開發了個簡單的java程序用於測試,查找問題原因。測試程序非常簡單,就是循環打印當前時間,如下所示:
package com.example; import java.time.LocalDateTime; public class demo { public static void main(String[] args) { do { System.out.println(LocalDateTime.now()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (true); } }
接下來,打 jar 包 test.jar(打包方法不是重點,省略)
有了 jar 包,開始注冊windows服務,服務注冊成功,結果如下:
C:\Users\xxx\Desktop\JavaService-2.0.10>JavaService.exe -install test "%JAVA_HOME%"\jre\bin\server\jvm.dll -Djava.class.path=C:\Users\xxx\Desktop\test.jar;"%JAVA_HOME%"\lib\tools.jar -Xms64M -Xmx512M -start com.example.demo The test automatic service was successfully installed
啟動服務,報錯:“test 服務無法啟動”
C:\Users\xxx\Desktop\JavaService-2.0.10>net start test test 服務正在啟動 . test 服務無法啟動。 服務沒有報告任何錯誤。 請鍵入 NET HELPMSG 3534 以獲得更多的幫助。
程序是可以正常運行的,使用 .bat 批處理腳本也可以啟動,但是使用JavaService.exe注冊的服務就是無法啟動。
測試程序沒有使用任何第三方庫,排除庫相關的問題;檢查JAVA_HOME環境變量,沒有問題;JAVA_HOME環境變量中存在空格問題,加雙引號即可(即命令行中的 "%JAVA_HOME%"),不是這個問題;cmd.exe是以管理員身份運行的,不是管理員權限問題。各種辦法都試過了,開始懷疑JavaService.exe有bug或者版本兼容問題,找到下載地址,這個程序最新版2.0.10都是2007年的,都十多年了,不可能有這樣嚴重的bug這么多年過去了程序還沒更新,2.0.10版網上有人也在用,也沒說有問題啊!最后看到有人用JavaService_2_0_10-amd64這個版本,找來試試吧,死馬當活馬醫了,結果這一試不要緊 ,居然啟動成功了!
如果使用的是64位版本的Java,JavaService.exe也要用64位版本,切記!!!JavaService.exe下載頁面的文件排列順序很讓人無語,下載過好幾次都沒有注意到64位版本的存在,尤其是我使用的2.0.10版,64位版本竟然在最下邊,不拉到底根本就看不到!
補充:測試程序 demo 的服務 test 啟動成功,但自己實際要運行的程序還是不能啟動,原因是 JavaService -start 參數設置不對,我的程序是個springboot項目,啟動類是“org.springframework.boot.loader.JarLauncher”,-start 參數改過來就好了。
最后,附上JavaService.exe下載地址: