Java程序多數情況下都會用到一些第三方的類庫,如果僅用到幾個jar文件,寫到java命令裡就好,但是依賴的jar文件很多的情況,寫到java命令裡就不好了,而且如果jar文件被替換,名字變了,就需要改java命令,所以最好在啟動命令裡不出現jar文件名。假設程序依賴的類庫jar文件存放在同級的lib目錄下,
簡單的:
java -Djava.ext.dirs=lib -Djava.library.path=lib com.myapp.MyAppClass $*
這個寫法絕大部分情況下都是正確有效的,但是曾經在啟動一個用Spring框架寫的程序時失敗,總報告某些類找不到,實際上都已在lib目錄下,原因不明。
下面換個方法,把依賴的jar文件都加入環境變量CLASSPATH,並且前面還增加了程序是否已啟動的檢查。
- #!/bin/sh
- ##############
- #判斷是否程序已啟動
- jappname='MyAppClass'
- javaps=`jps`
- i=0
- psid=0
- for psresult in $javaps
- do
- let cur=i%2
- if [ $cur -eq 0 ]; then
- psid=$psresult
- else
- if (test "$psresult" = "$jappname")
- then
- echo "程序"$jappname"[pid="$psid"]已經啟動!"
- exit 0
- fi
- fi
- let i++;
- done
- #引入依賴類庫到類路徑
- export CLASSPATH=.
- pathtmp=''
- for jarpath in `ls lib/*.jar`
- do
- CLASSPATH=$CLASSPATH:$jarpath
- done
- export CLASSPATH=$CLASSPATH
- java -server com.myapp.MyAppClass $*
附帶一個關閉大量Java進程的腳本
服務器上部署的有JBoss和十幾個Java程序,測試時經常需要把這十幾個Java程序重啟一遍,把Java進程全kill掉的話,JBoss也會被殺掉,但是JBoss不需要重啟,一個一個用ps命令找pid,再挨個kill?程序太多,無法忍受。JDK裡有個小工具叫jps,可以列出當前的Java進程,利用這個jps寫了一個殺掉除指定進程之外的所有Java進程的shell腳本。
- #####################
- #!/bin/sh
- # kill all java applications
- #####################
- javaps=`jps`
- i=0
- psid=0
- for psresult in $javaps
- do
- let cur=i%2
- if [ $cur -eq 0 ]; then
- psid=$psresult
- else
- if (test "$psresult" = "Main" -o "$psresult" = "Jps")
- then
- echo $psresult" not to be killed."
- else
- echo "kill "$psresult
- kill $psid
- fi
- fi
- let i++;
- done
Main是JBoss的主類名。