Windows系統啓動Java程序會彈出黑窗口。黑窗口有幾點很差。首先它不美觀;其次容易誤點致使程序關閉;但最讓我匪夷所思的是:將鼠標光標選中黑窗口日誌信息,程序居然不會繼續執行,日誌也不會繼續輸出。從而致使頁面一直處於請求狀態。回車後程序才能正常執行。同時客戶但願咱們能部署在Windows系統上而且作到開機自動啓動。針對以上需求將系統程序註冊成Windows服務變得尤其重要。java
針對於SpringBoot程序,目前主流的方法是採用winsw,簡單方便。但是在開發過程當中,針對不一樣的系統,啓動服務可能會出現意想不到的結果。一樣的配置方法,在win10能夠成功註冊並啓動服務。而在windows server 2012 卻啓動失敗。這裏分享個人經驗。mysql
winsw是⼀款能夠將可執⾏程序安裝成Windows Service的開源⼩⼯具,官⽹地址, 下載地址
製做步驟:
第一步:將springboot項目打包成MyServer.jargit
第二步:將下載的WinSW.NET2.exe 更名爲MyServer.exegithub
第三步:將下載的sample-minimal.xml 更名爲MyServer.xmlspring
第四步:註冊和啓動服務sql
這裏重點介紹 sample-minimal.xml 文件windows
<service> <!-- Windows 服務惟一標識ID--> <id>My Server</id> <!-- Windows 服務名稱--> <name>My Server</name> <!-- Windows 服務描述--> <description>This service is a service cratead from a minimal configuration</description> <!-- 啓動的可執行文件的路徑,若是已經配置環境變量,則沒必要寫全路徑(則實際上是一個坑) --> <executable>java</executable> <arguments> -jar MyServer.jar --spring.datasource.url=jdbc:mysql://localhost:3306/database </arguments> <!-- 日誌路徑,若目錄不存在,則默認爲配置文件所在的同一目錄--> <logpath>ServerPath\log\dashboard\</logpath> <!-- 日誌模式,默認爲append追加模型,rotate爲旋轉模式--> <logmode>rotate</logmode> </service>
executable:啓動可執行文件的全路徑,若是配置環境變量,則能夠簡寫,全部這裏填寫Javaspringboot
arguments:命令執行的參數app
logpath:配置日誌路徑工具
logmode:日誌輸出模式,默認爲append,官方文檔
MyServer.exe 是WinSW.NET2.exe文件。在win10系統上一次成功,沒有多餘的煩惱。可生活哪有這麼容易,在windows server 2012 r2的系統上啓動失敗。有錯誤不可怕,可怕的是不會找錯誤日誌。
服務啓動成功後自動關閉,配置的日誌文件也沒有生成。嘗試用cmd執行java -jar的命令,服務能夠正常啓動。但可具體是什麼錯誤卻不得而知。其實Windows服務是有日誌管理的。選擇:控制面板---管理工具---事件查看器---window日誌---應用程序---找出對應服務的日誌。以下:
Service cannot be started. System.ComponentModel.Win32Exception: The system cannot find the file specified at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at winsw.WrapperService.StartProcess(Process processToStart, String arguments, String executable) at winsw.WrapperService.OnStart(String[] _) at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)
提示很清楚,系統沒有找到指定文件,而在winsw的xml文件中就已經配置了executable,而且配置了環境變量。那爲何還提示文件沒有找到?抱着試一試的心態,將java改成了全路徑。從新註冊服務並啓動,結果服務啓動成功了。一肚子的火不知道往那撒。
爲了不這種事情再次發生,決定將executable的內容設置成Java的全路徑,因而簡單寫了一個bat文件。
@echo off # 獲取java環境變量 set JAVA_HOME=%JAVA_HOME% echo %JAVA_HOME% # 替換java路徑 setlocal enabledelayedexpansion set file=%cd%\MyServer.xml set file_tmp=%cd%\MyServer_tmp.xml set source=JAVAHOME set replaced=%JAVA_HOME%\bin\java for /f "delims=" %%i in (%file%) do ( set str=%%i set "str=!str:%source%=%replaced%!" echo !str!>>%file_tmp% ) move "%file_tmp%" "%file%" # 註冊並啓動服務 MyServer.exe uninstall MyServer.exe install MyServer.exe start EXIT