在linux上部署項(xiàng)目的時(shí)候,我們往往通過(guò)一段shell來(lái)啟動(dòng)程序,甚至是通過(guò)crontab定時(shí)任務(wù)來(lái)定時(shí)的調(diào)用java程序,但是很奇怪的一個(gè)問(wèn)題就是,比如我寫(xiě)了一個(gè)如下的shell腳本:
- #!/bin/sh
- # -----------------------------------------------------------------------------
- # Start script for the CMGP BOSSCONTROL
- #
- # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
- # -----------------------------------------------------------------------------
- #指定字符集
- LANG=zh_CN.GBK export LANG
- RUN_HOME=.
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar
- export CLASSPATH
- java com.**.checking.Checking_Start >> log.out &
手動(dòng)命令行運(yùn)行該腳本的時(shí)候,可以正常運(yùn)行java程序,但是使用crontab定時(shí)任務(wù),貌似就不起效果了,很是郁悶?zāi)模樵蚰模治隹赡茉颍?/span>
1)是否當(dāng)前用戶(hù)對(duì)此shell腳本沒(méi)有可執(zhí)行權(quán)限,通過(guò)ls -lrt /apps/service/mtk/checking/run.sh查看腳本是有可執(zhí)行,但是有執(zhí)行權(quán)限呀-rwxr-xr-x
2)既然單獨(dú)運(yùn)行腳本沒(méi)問(wèn)題,那會(huì)不會(huì)是定時(shí)的問(wèn)題呢?于是寫(xiě)了一個(gè)簡(jiǎn)單的輸出的shell腳本通過(guò)定時(shí)也是沒(méi)問(wèn)題的。說(shuō)明還是腳本的問(wèn)題。
后來(lái)上網(wǎng)查了下,想到可能是腳本中環(huán)境變量的原因,因?yàn)橥ㄟ^(guò)crontab運(yùn)行腳本,是以root用戶(hù),而不是當(dāng)前用戶(hù),于是cat /etc/profile查看環(huán)境變量,然后修改腳本如下:
- #!/bin/sh
- # -----------------------------------------------------------------------------
- # Start script for the CMGP BOSSCONTROL
- #
- # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
- # -----------------------------------------------------------------------------
- export PATH=/apps/usr/java/jdk1.5/bin:$PATH
- export JAVA_HOME=/apps/usr/java/jdk1.5
- export JRE_HOME=/apps/usr/java/jdk1.5/jre
- export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH
- RUN_HOME=/apps/service/checking
- CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
- CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar
- export CLASSPATH=$CLASSPATH
- java com.**.checking.Checking_Start >> log.out &
export顯示導(dǎo)出為用戶(hù)環(huán)境變量的環(huán)境變量
以上這種jar包是通過(guò)eclipse工具export導(dǎo)出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我們可以在打包默認(rèn)的build.xml文件中設(shè)置Class-Path
將第三方j(luò)ar包加入manifest.mf文件中,且指定程序主類(lèi)
在build.xml中添加如下內(nèi)容:
- <!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->
- <pathconvert property="libs.project" pathsep=" ">
- <mapper>
- <chainedmapper>
- <!-- remove absolute path -->
- <flattenmapper />
- <!-- add lib/ prefix -->
- <globmapper from="*" to="lib/*" />
- </chainedmapper>
- </mapper>
- <path>
- <!-- lib.home contains all jar files, in several subdirectories -->
- <fileset dir="${lib.dir}">
- <include name="**/*.jar" />
- </fileset>
- </path>
- </pathconvert>
另外,在create manifest文件時(shí),加上:
- <!-- 這樣就可以將第三方j(luò)ar包加入 -->
- <attribute name="Class-Path" value="${libs.project}" />
- <!-- 程序運(yùn)行的主類(lèi) -->
- <attribute name="Main-Class" value="com.**.checking.Checking_Start " />
這樣運(yùn)行ant,打成的jar包中MANIFEST.MF中內(nèi)容如下:
- Manifest-Version: 1.0
- Ant-Version: Apache Ant 1.7.0
- Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)
- Implementation-Title: fee task
- Implementation-Version: 1.0
- Implementation-Vendor: Aspire
- Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer
- Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm
- ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient
- .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l
- ib/log4j.jar lib/ojdbc14.jar
這樣在shell腳本中就不需要指定程序所需要的jar包了,也就不存在環(huán)境變量設(shè)置的惱人問(wèn)題。比較正規(guī)的也是這么操作的。
這樣在shell中就直接運(yùn)行jar包就行了:java -jar 主程序.jar -Xmx1024m -Xms1024m -Xmn512m,多好多方便~