最近開發了個java程序,打成 jar 包想要在windows後臺運行,因而使用JavaService.exe進行windows服務註冊,服務註冊很成功,可是在啓動時顯示「服務沒法啓動」,爲此耗費了大量的時間與精力,終於發現問題所在,特此記錄。java
爲了排除各類干擾因素,專門開發了個簡單的java程序用於測試,查找問題緣由。測試程序很是簡單,就是循環打印當前時間,以下所示:spring
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(打包方法不是重點,省略)windows
有了 jar 包,開始註冊windows服務,服務註冊成功,結果以下:springboot
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 服務沒法啓動」jvm
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這個版本,找來試試吧,死馬當活馬醫了,結果這一試沒關係 ,竟然啓動成功了!spa
若是使用的是64位版本的Java,JavaService.exe也要用64位版本,切記!!!JavaService.exe下載頁面的文件排列順序很讓人無語,下載過好幾回都沒有注意到64位版本的存在,尤爲是我使用的2.0.10版,64位版本居然在最下邊,不拉到底根本就看不到!命令行
補充:測試程序 demo 的服務 test 啓動成功,但本身實際要運行的程序仍是不能啓動,緣由是 JavaService -start 參數設置不對,個人程序是個springboot項目,啓動類是「org.springframework.boot.loader.JarLauncher」,-start 參數改過來就行了。code
最後,附上JavaService.exe下載地址:server