shell脚本运行java程序jar的方法
在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本:
#!/bin/sh exportmypath=/root/project/wishnomal java-Xmx3000m-Xms3000m-server-d64-Dfile.encoding=UTF-8-Dfetch.threads=300-classpath$mypath/:$mypath/wish2-assembly-1.0.0.jarnewstandard.CrawlerNewStandard$* echo"END"
手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了
分析可能原因:
1)是否当前用户对此shell脚本没有可执行权限,通过ls-lrt/apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x
2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。
后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat/etc/profile查看环境变量,然后修改脚本如下:
分析可能原因:
1)是否当前用户对此shell脚本没有可执行权限,通过ls-lrt/apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x
2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。
后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat/etc/profile查看环境变量,然后修改脚本如下:
#!/bin/sh exportmypath=/root/project/wishnomal exportJAVA_HOME=/root/lib/jdk1.7.0_72 PATH=$PATH:$JAVA_HOME/bin java-Xmx3000m-Xms3000m-server-d64-Dfile.encoding=UTF-8-Dfetch.threads=300-classpath$mypath/:$mypath/wish2-assembly-1.0.0.jarnewstandard.CrawlerNewStandard$* echo"END"
export显示导出为用户环境变量的环境变量
这样crontab计划任务就正常了。
修改参考:
#!/bin/sh #----------------------------------------------------------------------------- #StartscriptfortheCMGPBOSSCONTROL # #$Id:run_bosscontrol.sh,v1.02007/11/06Exp$ #----------------------------------------------------------------------------- #指定字符集 LANG=zh_CN.GBKexportLANG 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 exportCLASSPATH javacom.**.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 #----------------------------------------------------------------------------- #StartscriptfortheCMGPBOSSCONTROL # #$Id:run_bosscontrol.sh,v1.02007/11/06Exp$ #----------------------------------------------------------------------------- exportPATH=/apps/usr/java/jdk1.5/bin:$PATH exportJAVA_HOME=/apps/usr/java/jdk1.5 exportJRE_HOME=/apps/usr/java/jdk1.5/jre exportCLASSPATH=/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 exportCLASSPATH=$CLASSPATH javacom.**.checking.Checking_Start>>log.out&
export显示导出为用户环境变量的环境变量
以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path
将第三方jar包加入manifest.mf文件中,且指定程序主类
在build.xml中添加如下内容:
另外,在createmanifest文件时,加上:
这样运行ant,打成的jar包中MANIFEST.MF中内容如下:
Manifest-Version:1.0 Ant-Version:ApacheAnt1.7.0 Created-By:1.5.0_09-b01(SunMicrosystemsInc.) Implementation-Title:feetask Implementation-Version:1.0 Implementation-Vendor:Aspire Main-Class:com.aspire.cmgp.flowcontrol.server.FlowControlServer Class-Path:lib/cmgp-util-1.0.1.jarlib/commons-codec-1.3.jarlib/comm ons-collections.jarlib/commons-dbcp-1.2.1.jarlib/commons-httpclient .jarlib/commons-logging.jarlib/commons-pool-1.2.jarlib/dom4j.jarl ib/log4j.jarlib/ojdbc14.jar
这样在shell脚本中就不需要指定程序所需要的jar包了,也就不存在环境变量设置的恼人问题。比较正规的也是这么操作的。
这样在shell中就直接运行jar包就行了:java-jar主程序.jar-Xmx1024m-Xms1024m-Xmn512m,
#!/bin/bash后追加
source/etc/profile
source~/.bash_profile
测试下。。
#!/bin/sh exportJAVA_HOME=/usr/java/jdk1.6.0_18 exportCLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar foriinlib/*.jar; doCLASSPATH=$i:${CLASSPATH} done exportCLASSPATH=.:${CLASSPATH}
java-cp${CLASSPATH}main方法所在包名.main方法所在的类名
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。