现在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
本文介绍了如何将Spring Boot应用的jar包部署为服务,包括Windows和Linux两种环境的方法。在Windows上,使用了Windows Service Wrapper(jarrun)工具,提供了便捷的bat文件进行服务安装、启动等操作。而在Linux环境下,通过shell脚本实现jar的启动、停止和状态检查,强调了脚本执行时需要的换行格式为LF。
818

被折叠的 条评论
为什么被折叠?



