shell脚本运行java程序jar的方法

网友投稿 506 2023-03-25


shell脚本运行java程序jar的方法

在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本:

#!/bin/sh

export mypath=/root/project/wishnomal

java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.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

export mypath=/root/project/wishnomal

export JAVA_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.jar newstandard.CrawlerNewStandard $*

echo "END"

export显示导出为用户环境变量的环境变量

这样crontab计划任务就正常了。

修改参考:

#!/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 &

手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了,很是郁闷哪,查原因哪,分析可能原因:

1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

#!/bin/sh

# -----------------------------------------------------------------------------

# Start script for the CMGP BOSSCONTROL

#

# $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $

# --------------------------slwPM---------------------------------------------------

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显示导出为用户环境变量的环境变量

以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path

将第三方jar包加入manifest.mf文件中,且指定程序主类

在build.xml中添加如下内容:

另外,在create manifest文件时,加上:

这样运行ant,打成的jar包中MANIFEST.MF中内容如下:

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包了,也就不存在环境变量设置的恼人问题。比较正规的也是这么操作的。

这样在shell中就直接运行jar包就行了:java -jar 主程序.jar -Xmx1http://024m -Xms1024m -Xmn512m,

#!/bin/bash后追加

source /etc/profile

source ~/.bash_profile

测试下。。

#! /bin/sh

export JAVA_HOME=/usr/java/jdk1.6.0_18

export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar

for i in lib/*.jar;

do CLASSPATH=$i:${CLASSPATH}

done

export CLASSPATH=.:${CLASSPATH}

java -cp ${CLASSPATH} main方法所在包名.main方法所在的类名


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序的生命周期的详解
下一篇:管理后端接口的平台叫什么(后端管理框架)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~