現在spring boot用的比較多,基本有兩種方式發佈爲服務:
- 生成war,使用tomcat發佈
- 生成jar,以服務方式啓動
下面介紹如何將jar包發佈爲服務
1、WIN版本:(傳送門,jarrun)
Windows Service Wrapper 是win系統用於將exe或者jar包發佈爲服務形式運行的工具,配置簡單,使用非常方便。
但是配置簡單依然需要配置,我將需要生成的文件與配置文件直接生成爲一個bat文件,便於使用。這個是資源地址(傳送門,jarrun)
食用方法:(已經處理了管理員權限問題)
- 將jar包複製到jarrun目錄與winsw保持同一路徑,直接將jar包拖動到0.run.cmd,會生成一系列文件。
- 文件按順序分別爲1安裝爲服務,2卸載服務,3啓動服務,4停止服務,5重啓服務,6服務狀態,7cmd運行。jar名稱.xml爲具體配置文件,可以配置jar路徑和其它參數
怕資源漲價可以使用下面爲具體方式:
- 下載winsw.exe(名字一定得命名winsw.exe)
- 複製bat,創建到winsw同級別目錄。
- 點擊install安裝,start啓動。
chcp 65001
echo 以下爲批處理,放在處理目錄
set "jarPath=."
set "jarName=winsw"
set "jName=%~n1"
set "str=%~x1"
if "%str%"==".jar" set jarName=%jName%&set jarPath=.
set "serverName=%jarName%"
set "description=%jarName%"
set "arguments="
echo jarName:%jarName%
set winsw="winsw.exe"
echo 重命名文件
IF NOT EXIST %winsw% echo 不存在%winsw%文件,無法重命名&pause&exit
IF NOT EXIST "%jarName%.exe" rename "%winsw%" "%jarName%.exe"
echo 寫入配置文件
set xmlName="%jarName%.xml"
echo ^<service^> > %xmlName%
echo ^<id^>%jarName%^</id^> >>%xmlName%
echo ^<name^>%serverName%^</name^> >>%xmlName%
echo ^<description^>%description%^</description^> >>%xmlName%
echo ^<executable^>java^</executable^> >>%xmlName%
echo ^<arguments^>-jar "%jarPath%/%jarName%.jar" %arguments%^</arguments^> >>%xmlName%
echo ^<logpath^>%%BASE%%\logs^</logpath^> >>%xmlName%
echo ^<log mode="roll-by-time"^>^<pattern^>yyyyMMdd^</pattern^>^</log^> >>%xmlName%
echo ^</service^> >>%xmlName%
echo 生成運行文件
set jarNameTemp=%jarName%
echo %%1 %%2 mshta vbscript:createobject("shell.application").shellexecute("%%~s0","goto :runas","","runas",1)(window.close)^&exit > "1.install.bat"
echo :runas >> "1.install.bat"
echo pushd "%%~dp0" ^& "%jarName%.exe" install^&pause^&exit >> "1.install.bat"
echo %%1 %%2 mshta vbscript:createobject("shell.application").shellexecute("%%~s0","goto :runas","","runas",1)(window.close)^&exit > "2.uninstall.bat"
echo :runas >> "2.uninstall.bat"
echo pushd "%%~dp0" ^& "%jarName%.exe" uninstall^&pause^&exit >> "2.uninstall.bat"
echo %%1 %%2 mshta vbscript:createobject("shell.application").shellexecute("%%~s0","goto :runas","","runas",1)(window.close)^&exit > "3.start.bat"
echo :runas >>"3.start.bat"
echo pushd "%%~dp0" ^&"%jarName%.exe" start^&pause^&exit >> "3.start.bat"
echo %%1 %%2 mshta vbscript:createobject("shell.application").shellexecute("%%~s0","goto :runas","","runas",1)(window.close)^&exit > "4.stop.bat"
echo :runas >>"4.stop.bat"
echo pushd "%%~dp0" ^&"%jarName%.exe" stop^&pause^&exit >> "4.stop.bat"
echo %%1 %%2 mshta vbscript:createobject("shell.application").shellexecute("%%~s0","goto :runas","","runas",1)(window.close)^&exit > "5.restart.bat"
echo :runas >>"5.restart.bat"
echo pushd "%%~dp0" ^&"%jarName%.exe" restart^&pause^&exit >> "5.restart.bat"
echo pushd "%%~dp0" ^&"%jarName%.exe" status^&pause^&exit > "6.status.bat"
echo pushd "%%~dp0" ^&java -jar "%jarPath%/%jarName%.jar"^&pause^&exit > "7.cmdrun.bat"
echo 批處理結束
pause
2、linux版本 (只提供運行腳本)
linux啓動jar包的,可能會發現一個問題,就是最終運行的時候jps看到的只有pid和jar。而且重啓停止都不那麼方便。
食用方法:
- 修改shell相關配置,配置好服務名稱和jar名稱
- 使用 sh shell(這個是shell名稱).sh start 命令啓動,其它命令爲 stop 停止,status 狀態,restart 重啓。
最終效果:
注:shell腳本是linux下執行,需要設置換行格式爲LF(應該都懂的,CR(\r)是MacOS,CRLF(\n\r)是win,LF是linux(\n))
#!/bin/sh
APP_NAME=owms-codegen
#jar包路徑
JAR_PATH='/sce/dist/release'
#jar名稱
JAR_NAME=$APP_NAME.jar
#日誌路徑
LOG_PATH='/sce/dist/release/logs'
#PID 代表是PID文件
PID=pid/$APP_NAME\.pid
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$JAR_PATH
export DEFAULT_SEARCH_LOCATIONS="classpath:/,classpath:/config/,file:./,file:./config/"
export CUSTOM_SEARCH_LOCATIONS=${DEFAULT_SEARCH_LOCATIONS},file:${BASE_DIR}/,file:${BASE_DIR}/conf/
#使用說明,用來提示輸入參數
usage() {
echo "Usage: sh 執行腳本.sh [start|stop|restart|status]"
exit 1
}
#檢查程序是否在運行
is_exist() {
if [ ! -d pid ]; then
mkdir pid
fi
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#啓動方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo ">>> $APP_NAME is already running PID=${pid} <<<"
else
#JAVA_OPT_EXT="${JAVA_OPT_EXT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT_EXT="${JAVA_OPT_EXT} -XX:+UseG1GC -XX:+G1ElasticHeap"
JAVA_OPT_EXT="${JAVA_OPT_EXT} -XX:+CompilationWarmUp -XX:-TieredCompilation -XX:CompilationWarmUpLogfile=jwarmup.log -XX:CompilationWarmUpDeoptTime=0"
JAVA_OPT=" -jar ${BASE_DIR}/${APP_NAME}.jar"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} --spring.config.location=${CUSTOM_SEARCH_LOCATIONS}"
JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"
if [ ! -d "${LOG_PATH}" ]; then
mkdir ${LOG_PATH}
fi
echo "$JAVA ${JAVA_OPT}"
# check the log output file
if [ ! -f "${LOG_PATH}/${APP_NAME}.log" ]; then
touch "${LOG_PATH}/${APP_NAME}.log"
fi
echo "$JAVA ${JAVA_OPT}" >$LOG_PATH/$APP_NAME.log 2>&1 &
nohup $JAVA ${JAVA_OPT} >/dev/null 2>&1 &
# cd $JAR_PATH && nohup java -Xms256m -Xmx512m -Dapp.name="$JAR_NAME" -Dapp.home="$JAR_PATH" -Dbasedir="$JAR_PATH" --spring.config.location="classpath:/,classpath:/config/,file:./,file:./config/" -jar $JAR_NAME >>$LOG_PATH/$APP_NAME.log 2>&1 &
echo $! >$PID
echo ">>> start $APP_NAME successed PID=$! <<<"
fi
}
#停止方法
stop() {
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> PID = $pidf begin kill $pidf <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> PID = $pid begin kill -9 $pid <<<"
kill -9 $pid
sleep 2
echo ">>> $APP_NAME process stopped <<<"
else
echo ">>> $APP_NAME is not running <<<"
fi
}
#輸出運行狀態
status() {
is_exist
if [ $? -eq "0" ]; then
echo ">>> $APP_NAME is running PID is ${pid} <<<"
else
echo ">>> $APP_NAME is not running <<<"
fi
}
#重啓
restart() {
stop
start
}
#根據輸入參數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0