jar服务部署

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

现在spring boot用的比较多,基本有两种方式发布为服务:

  1. 生成war,使用tomcat发布
  2. 生成jar,以服务方式启动

下面介绍如何将jar包发布为服务

1、WIN版本:(传送门,jarrun

Windows Service Wrapper 是win系统用于将exe或者jar包发布为服务形式运行的工具,配置简单,使用非常方便。

但是配置简单依然需要配置,我将需要生成的文件与配置文件直接生成为一个bat文件,便于使用。这个是资源地址(传送门,jarrun

食用方法:(已经处理了管理员权限问题)

  1. 将jar包复制到jarrun目录与winsw保持同一路径,直接将jar包拖动到0.run.cmd,会生成一系列文件。
  2. 文件按顺序分别为1安装为服务,2卸载服务,3启动服务,4停止服务,5重启服务,6服务状态,7cmd运行。jar名称.xml为具体配置文件,可以配置jar路径和其它参数

怕资源涨价可以使用下面为具体方式:

  1. 下载winsw.exe(名字一定得命名winsw.exe)
  2. 复制bat,创建到winsw同级别目录。
  3. 点击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。而且重启停止都不那么方便。

食用方法:

  1. 修改shell相关配置,配置好服务名称和jar名称
  2. 使用 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值