Windows系統啟動Java程序會彈出黑窗口。黑窗口有幾點不好。首先它不美觀;其次容易誤點導致程序關閉;但最讓我匪夷所思的是:將鼠標光標選中黑窗口日志信息,程序竟然不會繼續執行,日志也不會繼續輸出。從而導致頁面一直處于請求狀態?;剀嚭蟪绦虿拍苷绦?。同時客戶希望我們能部署在Windows系統上并且做到開機自動啟動。針對以上需求將系統程序注冊成Windows服務變得尤為重要。
針對于SpringBoot程序,目前主流的方法是采用winsw,簡單方便??墒窃陂_發過程中,針對不同的系統,啟動服務可能會出現意想不到的結果。同樣的配置方法,在win10可以成功注冊并啟動服務。而在windows server 2012 卻啟動失敗。這里分享我的經驗。
注冊windows服務制作流程
winsw是?款可以將可執?程序安裝成Windows Service的開源??具,官地址, 下載地址
制作步驟:
第一步:將springboot項目打包成MyServer.jar
第二步:將下載的WinSW.NET2.exe 改名為MyServer.exe
第三步:將下載的sample-minimal.xml 改名為MyServer.xml
第四步:注冊和啟動服務
這里重點介紹 sample-minimal.xml 文件
<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:啟動可執行文件的全路徑,如果配置環境變量,則可以簡寫,所有這里填寫Java
arguments:命令執行的參數
logpath:配置日志路徑
logmode:日志輸出模式,默認為append,官方文檔
winsw常用命令
MyServer.exe 是WinSW.NET2.exe文件。在win10系統上一次成功,沒有多余的煩惱??缮钅挠羞@么容易,在windows server 2012 r2的系統上啟動失敗。有錯誤不可怕,可怕的是不會找錯誤日志。
啟動windows服務失敗
服務啟動成功后自動關閉,配置的日志文件也沒有生成。嘗試用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 enabledelayedexpansionset file=%cd%/MyServer.xmlset file_tmp=%cd%/MyServer_tmp.xmlset source=JAVAHOMEset replaced=%JAVA_HOME%/bin/javafor /f "delims=" %%i in (%file%) do ( set str=%%i set "str=!str:%source%=%replaced%!" echo !str!>>%file_tmp%)move "%file_tmp%" "%file%"# 注冊并啟動服務MyServer.exe uninstallMyServer.exe installMyServer.exe startEXIT
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選