Jetty組み込みスタートアップ2

転載アドレス:https://blog.3u3.me/post/shell-boot-java-pro/

2016年10月12日

Javaプログラムシェルスクリプトを開始します

このスクリプトは以前に作成されたものであり、以前に作成したときに他の人が作成したスクリプトも参照しました。最終的な実装は、スタートアップクラス、クラスパス、その他の構成を含むいくつかのスタートアップ依存関係をjarパッケージに入れ、パッケージ化することです。 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を= 256メートル" MAIN_CLASS = com.example.project.Main PROCESS_NAME =プロジェクト名#スクリプトの実行パス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 
################# #再帰的にトラバースすべてのディレクトリおよびクラスパスに追加###### ## ##########関数_gcpath(){
           RES = $ 1のためのファイル、LS ' $ 1 '行うローカルパス= $ 1 "/" $ファイルなら[ -d $ {パス} ]次に、       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 變量即可.

おすすめ

転載: blog.csdn.net/gredn/article/details/78199635