Jetty 內嵌啟動2
阿新 • • 發佈:2018-12-27
早這之前就有寫過該指令碼, 之前寫的時候也參照過別人寫的指令碼, 最後的實現方式是將一些啟動時依賴打入到 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 |
#!/bin/bash |
使用的時候將指令碼中的 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
變數即可.