1.終端cmd窗口運行jar
Java項目一般會被打包成jar后啟動,在windows系統(tǒng)中可以通過終端窗口cmd啟動jar包,即在jar包所在的目錄中打開cmd,或在cmd中進入到jar包目錄,執(zhí)行如下命令:
java -jar myzhxy-1.0.0.jar
或
javaw -jar myzhxy-1.0.0.jar
// java.exe會在窗口中打印信息,而javaw.exe不會顯示任何東西。
如果想指定jar包啟動時用的配置文件,可用-Dspring.config.location指定配置文件路徑,這樣即可達到配置文件參數(shù)可修改的目的:
java -jar myzhxy-1.0.0.jar -Dspring.config.location=D:\config\application.properties
2. bat腳本啟動jar包
創(chuàng)建一個bat文件,將上面的命令放入bat文件即可,之后只需要將bat和jar包放在同一個目錄下,雙擊bat腳本即可啟動jar包服務。
3.后臺啟動bat腳本
以上的bat腳本雙擊運行后會出現(xiàn)黑色cmd的終端窗口,若不想出現(xiàn)該窗口,可讓其后臺啟動運行,這樣就可以避免不小心關閉了創(chuàng)建運行,即可在腳本開頭加入以下代碼:
if "%1"=="h" goto begin
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
4. 運行bat只啟動一次jar服務及停止腳本
通過bat腳本后臺啟動jar服務后,可能會出現(xiàn)在啟動之前,該服務要使用的端口已經(jīng)被占用,或者說該服務已經(jīng)被啟動,則需要將被占用的端口釋放掉,且事先需要判斷該jar服務是否被啟動,如果已經(jīng)在啟動狀態(tài),則不需要重新啟動。
查找端口是否被占用,如果端口被占用則將該端口的進程殺掉:
netstat -ano |findstr 9001 // 根據(jù)端口號查進程
taskkill /f /pid 8224 // 根據(jù)進程id殺進程
由于端口有可能是被其他服務占用,所以要判斷該jar服務是否被啟動就不能再通過端口是否被占用來判斷了。這時可以用wmic通過執(zhí)行jar包的命令去查找進程(思路來源于:Java調(diào)用執(zhí)行python腳本 )
wmic process where 'commandline like "%myzhxy-1.0.0.jar%"' get processid
但是,發(fā)現(xiàn)通過該命令查找的進程有兩個,且將第一個殺掉之后,再次執(zhí)行該命令查找進程還是能查到。
再次運行該bat,查找命令,同時將name查找出來,會發(fā)現(xiàn),查出來兩個進程id是因為wmic本身也算啟了一個進程。即可通過執(zhí)行器的name和執(zhí)行命令一起查詢進程id,殺掉之后再次查詢出現(xiàn)沒有可以實例即表明該服務已經(jīng)被停止了:
wmic process where 'name = "java.exe" and commandline like "%myzhxy-1.0.0.jar%"' get processid,name
即,同理,停止jar服務的bat腳本也只能停止指定jar的服務,通過端口停止進程也有可能停止的是其他的服務。停止jar服務的bat腳本代碼如下:
@echo off
for /f "usebackq skip=1 tokens=*" %%I in (`wmic process where "name = 'java.exe' and commandline like '%%myzhxy-1.0.0.jar%%'" get processid 2^>null`) do (
echo %%I
if %%I GTR 1 (
echo processid is: %%I
set pid=%%I
goto break
)
)
:break
if defined pid (
echo pid = %pid%
echo taskkill /f /pid %pid%
taskkill /f /pid %pid%
echo Succeeded in killing the process.
) else echo The process does not exit.
pause
則,只啟動一次的,若jar服務已啟動則不啟動,沒有啟動則先查看端口是否被其他進程占用,占用則釋放端口后再啟動的bat腳本代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-546664.html
@echo off
for /f "usebackq skip=1 tokens=*" %%I in (`wmic process where "name = 'java.exe' and commandline like '%%myzhxy-1.0.0.jar%%'" get processid 2^>null`) do (
if %%I GTR 1 (
echo processid is: %%I
set pid=%%I
goto break
)
)
set port=9001
echo port=%port%
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^|findstr %port%`) do (
if [%%d] EQU [LISTENING] (
set pid=%%e
)
)
if defined pid (
echo pid = %pid%
echo taskkill /f /pid %pid%
taskkill /f /pid %pid%
echo Succeeded in killing the process.
) else echo The process does not exit.
echo java -jar myzhxy-1.0.0.jar
java -jar myzhxy-1.0.0.jar
:break
pause
5.注意事項
- bat語法中,不能想Java一樣使用break來終止for循環(huán),而是使用 goto的方式來跳出循環(huán)。
- bat中 比較符號 表示如下:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
- bat中定義變量set port=9001 等號兩邊不能有空格,否則是錯誤命令行。
- 使用wmic命令獲取的進程,要判斷是否獲取到進程id不能判斷其是否為空字符,且判斷獲取的%%I是否大于1,中%%I不能加中括號,[%%I],否則被當成字符形式,一直滿足判斷條件。導致終止不了for循環(huán)
6.所用資源
腳本資源文章來源地址http://www.zghlxwxcb.cn/news/detail-546664.html
到了這里,關于bat腳本啟動Java服務的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!