1. 程式人生 > >Jetty 內嵌啟動2

Jetty 內嵌啟動2

早這之前就有寫過該指令碼, 之前寫的時候也參照過別人寫的指令碼, 最後的實現方式是將一些啟動時依賴打入到 jar 包中, 包括啟動類, classpath 等配置, 打包通過 maven 去實現的.
但是這種方式也有些許弊端, 因為 maven 中打包配置這些打包依賴真的很麻煩, 各種配置不統一, 跨專案檔案移動等配置, 有興趣可以去看看 當然, 我就是在扯淡 中的 maven 案例.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
#!/bin/bash
# # # JAVA=java JAVA_OPTS="-Xms512m -Xmx1536m -XX:PermSize=64M -XX:MaxPermSize=256m" MAIN_CLASS=com.example.project.Main PROCESS_NAME=ProjectName # 指令碼執行路徑 BIN_PATH=$(dirname $(readlink -f $0)) # 專案根路徑 HOME_PATH=$(cd ${BIN_PATH}'/../'; pwd) # 資源依賴路徑 LIB_PATH=${HOME_PATH}'/lib' # 配置檔案路徑 CONF_PATH=${HOME_PATH}
'/conf'
# PID 檔案 PID_FILE=${BIN_PATH}'/'${PROCESS_NAME}'.pid' #echo $HOME_PATH #echo $BIN_PATH #echo $LIB_PATH #echo $CONF_PATH #echo $PID_FILE # ################ # 遞迴遍歷所有目錄加入到 classpath 中 # ################# function _gcpath(){ res=$1 for file in `ls $1` do local path=$1"/"$file if [ -d ${path} ] then res=${res}':'$(_gcpath ${path}) else res=${res}:${path} fi done echo $res } # ########### # 接收需要加入到 classpath 的目錄 # 依次拼接 classpath # ########### function cppath(){ res= count=$# index=0 for parent in $* do ((index++)) res=${res}$(_gcpath ${parent}) #((index<count))&&(res=${res}':') if ((index<count)) then res=${res}':' fi done echo ${res} } case $1 in start) echo -n 'Starting worker ... ' if [ -f ${PID_FILE} ]; then if kill -0 `cat ${PID_FILE}` > /dev/null 2>&1; then echo ${PROCESS_NAME} already running as process `cat ${PID_FILE}`. exit 0 fi fi ## 獲取專案 classpath # 取出依賴包路徑 CPPATH=$(cppath ${LIB_PATH} ${CONF_PATH}) # cppath $LIB_PATH $CONF_PATH # echo $CPPATH COMMAND=${JAVA}' '${JAVA_OPTS}' '-cp' '\"${CPPATH}\"' '${MAIN_CLASS} # echo $COMMEND nohup ${COMMAND} > /dev/null 2>&1 & if [ $? -eq 0 ]; then echo $! if echo -n $! > "$PID_FILE" then sleep 1 echo STARTED else echo FAILED TO WRITE PID exit 1 fi else echo SERVER DID NOT START exit 1 fi ;; stop) echo -n 'Stopping worker ... ' if [ ! -f "$PID_FILE" ] then echo "no worker to stop (could not find file $PID_FILE)" else echo ${PID_FILE} kill -9 $(cat "$PID_FILE") rm "$PID_FILE" echo STOPPED fi ;; restart) shift ./"$0" stop ${@} sleep 3 ./"$0" start ${@} ;; status) if [ ! -f "$PID_FILE" ] then echo "no worker is running." else echo "worker is running (pid=$PID_FILE)" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" >&2 esac

使用的時候將指令碼中的 JAVA JAVA_OPTS MAIN_CLASS PROCESS_NAME 變數值修改成自己專案的資訊即可.

此指令碼要求專案格式類似如下:

1
2
3
4
5
6
├── bin
│   └── service.sh
├── conf
│   └── ep.properties
└── lib
    └── example.jar

bin 目錄下存放的是當前指令碼
conf 存放專案的配置檔案
lib 存放專案的依賴包, 並且包括啟動包

如果有不同的目錄結構, 修改這些配置的變數值.

啟動

1
service.sh start

停止

1
service.sh stop

重啟

1
service.sh restart

狀態

1
service.sh status

這個指令碼中大抵上和之前使用的指令碼方式類似, 只是將 clsspath 的提取從 maven 中提取到 bash 來實現, clsspath 的提取是該指令碼中的兩個函式來實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# ################
# 遞迴遍歷所有目錄加入到 classpath 中
# #################
function _gcpath(){
  res=$1
  for file in `ls $1`
  do
    local path=$1"/"$file
    if [ -d ${path} ]
    then
      res=${res}':'$(_gcpath ${path})
    else
      res=${res}:${path}
    fi
  done
  echo $res
}

# ###########
# 接收需要加入到 classpath 的目錄
# 依次拼接 classpath
# ###########
function cppath(){
 res=
 count=$#
 index=0
 for parent in $*
  do
   ((index++))
   res=${res}$(_gcpath ${parent})
   #((index<count))&&(res=${res}':')
   if ((index<count))
    then
      res=${res}':'
   fi
  done
 echo ${res}
}

cppath 函式的作用是接收需要加入到 classpath 的目錄
_gcpath 函式用來遞迴提取這些目錄下的所有檔案放入到 classpath 中

所有路徑都是使用在系統中的絕對路徑.

注意:
pid 檔案預設是存放在 bin/${PROCESS_NAME}.pid 中, 在以前的使用經驗中發現將 pid 檔案放在 /tmp 目錄是一種非常不靠譜的做法, 長時間執行後不知為何 /tmp 中的 pid 檔案不見了, 具體使用時可根據專案需求自定義位置, 修改 PID_FILE 變數即可.