首頁  >  文章  >  Java  >  shell腳本實作運行Java程式jar的方法

shell腳本實作運行Java程式jar的方法

黄舟
黄舟原創
2017-10-19 09:30:052571瀏覽

本篇文章主要介紹了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 $ 
# ----------------------------------------------------------------------------- 
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 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檔時,加上:


<!-- 这样就可以将第三方jar包加入 -->  
<attribute name="Class-Path" value="${libs.project}" /> 
<!-- 程序运行的主类 --> 
<attribute name="Main-Class" value="com.**.checking.Checking_Start " />

這樣運行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 -Xmx1024m -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方法所在的類別名稱

以上是shell腳本實作運行Java程式jar的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn