jar服務部署

現在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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章