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 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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,官方文檔
- append (追加模式)其特點是將日志文件全部輸出在一個文件中,這個文件可能會越來越大。
- rotate(旋轉模式,推薦)當日志文件大小達到10兆(默認值),winsw會將日志重新輸出到另外一份日志文件,最多保留8個(默認值)。
- reset(重置模式)每次重啟服務都會重置日志文件。
- none(忽略模式)幾乎不會生成日志文件。
winsw常用命令
- myserver.exe install:安裝服務
- myserver.exe uninstall:刪除服務
- myserver.exe start:啟動服務
- myserver.exe stop:停?服務
- myserver.exe restart:重啟服務
- myserver.exe status:輸出當前服務的狀態
myserver.exe 是winsw.net2.exe文件。在win10系統上一次成功,沒有多余的煩惱。可生活哪有這么容易,在windows server 2012 r2的系統上啟動失敗。有錯誤不可怕,可怕的是不會找錯誤日志。
啟動windows服務失敗
服務啟動成功后自動關閉,配置的日志文件也沒有生成。嘗試用cmd執行java -jar的命令,服務可以正常啟動。但可具體是什么錯誤卻不得而知。其實windows服務是有日志管理的。選擇:控制面板---管理工具---事件查看器---window日志---應用程序---找出對應服務的日志。如下:
1
2
3
4
5
6
|
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文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@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 |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/itdragon/p/10513474.html