shell指令碼運行java程式

來源:互聯網
上載者:User

      在linux上部署項目的時候,我們往往通過一段shell來啟動程式,甚至是通過crontab定時任務來定時的調用java程式,但是很奇怪的一個問題就是,比如我寫了一個如下的shell指令碼:

 

#!/bin/sh<br /># -----------------------------------------------------------------------------<br /># Start script for the CMGP BOSSCONTROL<br />#<br /># $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $<br /># -----------------------------------------------------------------------------<br />#指定字元集<br />LANG=zh_CN.GBK export LANG<br />RUN_HOME=.<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar</p><p>export CLASSPATH</p><p>java com.**.checking.Checking_Start >> log.out &  

 

手動命令列運行該指令碼的時候,可以正常運行java程式,但是使用crontab定時任務,貌似就不起效果了,很是鬱悶哪,查原因哪,分析可能原因:

 1)是否目前使用者對此shell指令碼沒有可執行許可權,通過ls -lrt /apps/service/mtk/checking/run.sh查看指令碼是有可執行,但是有執行許可權呀-rwxr-xr-x

 2)既然單獨運行指令碼沒問題,那會不會是定時的問題呢?於是寫了一個簡單的輸出的shell指令碼通過定時也是沒問題的。說明還是指令碼的問題。

後來上網查了下,想到可能是指令碼中環境變數的原因,因為通過crontab運行指令碼,是以root使用者,而不是目前使用者,於是cat /etc/profile查看環境變數,然後修改指令碼如下:

#!/bin/sh<br /># -----------------------------------------------------------------------------<br /># Start script for the CMGP BOSSCONTROL<br />#<br /># $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $<br /># -----------------------------------------------------------------------------<br />export PATH=/apps/usr/java/jdk1.5/bin:$PATH<br />export JAVA_HOME=/apps/usr/java/jdk1.5<br />export JRE_HOME=/apps/usr/java/jdk1.5/jre<br />export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH<br />RUN_HOME=/apps/service/checking<br />CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar<br />CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar<br /> CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar</p><p>export CLASSPATH=$CLASSPATH</p><p>java com.**.checking.Checking_Start >> log.out &

 

export顯示匯出為使用者環境變數的環境變數
以上這種jar包是通過eclipse工具export匯出,不包含MANIFEST.MF檔案,如果使用打包工具Ant,我們可以在打包預設的build.xml檔案中設定Class-Path
將第三方jar包加入manifest.mf檔案中,且指定程式主類
在build.xml中添加如下內容:

 

<!-- create a property containing all .jar files, prefix lib/, and seperated with a space --><br /><pathconvert property="libs.project" pathsep=" "><br /> <mapper><br /> <chainedmapper><br /> <!-- remove absolute path --><br /> <flattenmapper /><br /> <!-- add lib/ prefix --><br /> <globmapper from="*" to="lib/*" /><br /> </chainedmapper><br /> </mapper><br /> <path><br /> <!-- lib.home contains all jar files, in several subdirectories --><br /> <fileset dir="${lib.dir}"><br /> <include name="**/*.jar" /><br /> </fileset><br /> </path><br /> </pathconvert>

 

另外,在create manifest檔案時,加上:

<!-- 這樣就可以將第三方jar包加入 --><br /><attribute name="Class-Path" value="${libs.project}" /><br /><!-- 程式啟動並執行主類 --><br /><attribute name="Main-Class" value="com.**.checking.Checking_Start " />

 

這樣運行ant,打成的jar包中MANIFEST.MF中內容如下:

Manifest-Version: 1.0<br />Ant-Version: Apache Ant 1.7.0<br />Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)<br />Implementation-Title: fee task<br />Implementation-Version: 1.0<br />Implementation-Vendor: Aspire<br />Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer<br />Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm<br /> ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient<br /> .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l<br /> ib/log4j.jar lib/ojdbc14.jar

 

這樣在shell指令碼中就不需要指定程式所需要的jar包了,也就不存在環境變數設定的惱人問題。比較正規的也是這麼操作的。
這樣在shell中就直接運行jar包就行了:java -jar 主程式.jar -Xmx1024m -Xms1024m -Xmn512m,多好多方便~

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.