詳解SpringBoot注冊Windows服務(wù)和啟動報錯的原因
Windows系統(tǒng)啟動Java程序會彈出黑窗口。黑窗口有幾點不好。首先它不美觀;其次容易誤點導(dǎo)致程序關(guān)閉;但最讓我匪夷所思的是:將鼠標(biāo)光標(biāo)選中黑窗口日志信息,程序竟然不會繼續(xù)執(zhí)行,日志也不會繼續(xù)輸出。從而導(dǎo)致頁面一直處于請求狀態(tài)。回車后程序才能正常執(zhí)行。同時客戶希望我們能部署在Windows系統(tǒng)上并且做到開機自動啟動。針對以上需求將系統(tǒng)程序注冊成Windows服務(wù)變得尤為重要。
針對于SpringBoot程序,目前主流的方法是采用winsw,簡單方便??墒窃陂_發(fā)過程中,針對不同的系統(tǒng),啟動服務(wù)可能會出現(xiàn)意想不到的結(jié)果。同樣的配置方法,在win10可以成功注冊并啟動服務(wù)。而在windows server 2012 卻啟動失敗。這里分享我的經(jīng)驗。
注冊windows服務(wù)制作流程
winsw是⼀款可以將可執(zhí)⾏程序安裝成Windows Service的開源⼩⼯具,官⽹地址, 下載地址
制作步驟:
第一步:將springboot項目打包成MyServer.jar
第二步:將下載的WinSW.NET2.exe 改名為MyServer.exe
第三步:將下載的sample-minimal.xml 改名為MyServer.xml
第四步:注冊和啟動服務(wù)
這里重點介紹 sample-minimal.xml 文件
<service> <!-- Windows 服務(wù)唯一標(biāo)識ID--> <id>My Server</id> <!-- Windows 服務(wù)名稱--> <name>My Server</name> <!-- Windows 服務(wù)描述--> <description>This service is a service cratead from a minimal configuration</description> <!-- 啟動的可執(zhí)行文件的路徑,如果已經(jīng)配置環(huán)境變量,則不必寫全路徑(則其實是一個坑) --> <executable>java</executable> <arguments> -jar MyServer.jar --spring.datasource.url=jdbc:mysql://localhost:3306/database </arguments> <!-- 日志路徑,若目錄不存在,則默認為配置文件所在的同一目錄--> <logpath>ServerPath\log\dashboard\</logpath> <!-- 日志模式,默認為append追加模型,rotate為旋轉(zhuǎn)模式--> <logmode>rotate</logmode> </service>
executable:啟動可執(zhí)行文件的全路徑,如果配置環(huán)境變量,則可以簡寫,所有這里填寫Java
arguments:命令執(zhí)行的參數(shù)
logpath:配置日志路徑
logmode:日志輸出模式,默認為append,官方文檔
- append (追加模式)其特點是將日志文件全部輸出在一個文件中,這個文件可能會越來越大。
- rotate(旋轉(zhuǎn)模式,推薦)當(dāng)日志文件大小達到10兆(默認值),winsw會將日志重新輸出到另外一份日志文件,最多保留8個(默認值)。
- reset(重置模式)每次重啟服務(wù)都會重置日志文件。
- none(忽略模式)幾乎不會生成日志文件。
winsw常用命令
- MyServer.exe install:安裝服務(wù)
- MyServer.exe uninstall:刪除服務(wù)
- MyServer.exe start:啟動服務(wù)
- MyServer.exe stop:停⽌服務(wù)
- MyServer.exe restart:重啟服務(wù)
- MyServer.exe status:輸出當(dāng)前服務(wù)的狀態(tài)
MyServer.exe 是WinSW.NET2.exe文件。在win10系統(tǒng)上一次成功,沒有多余的煩惱??缮钅挠羞@么容易,在windows server 2012 r2的系統(tǒng)上啟動失敗。有錯誤不可怕,可怕的是不會找錯誤日志。
啟動windows服務(wù)失敗
服務(wù)啟動成功后自動關(guān)閉,配置的日志文件也沒有生成。嘗試用cmd執(zhí)行java -jar的命令,服務(wù)可以正常啟動。但可具體是什么錯誤卻不得而知。其實Windows服務(wù)是有日志管理的。選擇:控制面板---管理工具---事件查看器---window日志---應(yīng)用程序---找出對應(yīng)服務(wù)的日志。如下:
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)
提示很清楚,系統(tǒng)沒有找到指定文件,而在winsw的xml文件中就已經(jīng)配置了executable,并且配置了環(huán)境變量。那為什么還提示文件沒有找到?抱著試一試的心態(tài),將java改為了全路徑。重新注冊服務(wù)并啟動,結(jié)果服務(wù)啟動成功了。一肚子的火不知道往那撒。
為了避免這種事情再次發(fā)生,決定將executable的內(nèi)容設(shè)置成Java的全路徑,于是簡單寫了一個bat文件。
@echo off # 獲取java環(huán)境變量 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%" # 注冊并啟動服務(wù) MyServer.exe uninstall MyServer.exe install MyServer.exe start EXIT
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
HttpClient HttpRoutePlanner接口確定請求目標(biāo)路由
這篇文章主要為大家介紹了使用HttpClient HttpRoutePlanner接口確定請求目標(biāo)路由,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10SpringBoot+Querydsl?框架實現(xiàn)復(fù)雜查詢解析
本篇主要將介紹的是利用spring query dsl框架實現(xiàn)的服務(wù)端查詢解析和實現(xiàn)介紹,對SpringBoot?Querydsl?查詢操作感興趣的朋友一起看看吧2022-05-05Java之使用POI教你玩轉(zhuǎn)Excel導(dǎo)入與導(dǎo)出
這篇文章主要介紹了Java之使用POI教你玩轉(zhuǎn)Excel導(dǎo)入與導(dǎo)出,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10Java設(shè)計模式單例模式(Singleton)用法解析
這篇文章主要介紹了Java設(shè)計模式單例模式(Singleton)用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11