ホームページ  >  記事  >  Java  >  シェルスクリプトはJavaプログラムjarを実行するメソッドを実装します

シェルスクリプトはJavaプログラムjarを実行するメソッドを実装します

黄舟
黄舟オリジナル
2017-10-19 09:30:052571ブラウズ

この記事では、主に Java プログラム jar をシェル スクリプトで実行する方法を紹介します。編集者がそれを参考にさせていただきます。エディターをフォローして見てみましょう

Ubuntu にプロジェクトをデプロイするとき、シェルを通じてプログラムを開始したり、crontab のスケジュールされたタスクを通じて Java プログラムを定期的に呼び出したりすることがよくありますが、非常に奇妙な問題が発生します。次のようにシェル スクリプトを作成しました:


#!/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 ) 現在のユーザーがこのシェル スクリプトの実行権限を持っていないか、ls -lrt /apps/service/mtk/checking/run.sh を通じてスクリプトが実行可能であるが、実行権限 -rwxr-xr-x があるかどうかを確認します

2) スクリプトを単独で実行するのは問題ないので、タイミングの問題でしょうか?そこで、簡単な出力シェルスクリプトを作成しましたが、タイミング的には問題ありませんでした。問題は依然としてスクリプトにあります。

後でオンラインで確認したところ、スクリプト内の環境変数が原因ではないかと思いました。crontab を介してスクリプトを実行すると、現在のユーザーの代わりに root ユーザーが使用されるため、/etc/profile を実行して cat /etc/profile を確認しました。

考えられる理由の分析:

1) 現在のユーザーがこのシェル スクリプトの実行権限を持っていないかどうか ls -lrt /apps/service/mtk/checking/run を使用します。 .sh スクリプトが実行可能であるかどうかを確認しますが、実行権限がある - rwxr-xr-x

2) スクリプトを単独で実行するのは問題ないので、タイミングの問題ですか?そこで、簡単な出力シェルスクリプトを作成しましたが、タイミング的には問題ありませんでした。問題は依然としてスクリプトにあります。

後でインターネットで調べたところ、スクリプト内の環境変数かもしれないと思いました。crontab を介してスクリプトを実行すると、現在のユーザーの代わりに root ユーザーが使用されるため、環境を確認するために /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) 現在のユーザーがこのシェル スクリプトの実行権限を持っていないかどうか、ls -lrt /apps/service/mtk/checking/run.sh を使用して、スクリプトが実行可能であるかどうかを確認しますが、実行権限があるかどうかを確認します。 -rwxr-xr -x

2) スクリプト単体で実行しても問題ないので、タイミングの問題でしょうか?そこで、簡単な出力シェルスクリプトを作成しましたが、タイミング的には問題ありませんでした。問題は依然としてスクリプトにあります。

後でインターネットで調べたところ、スクリプト内の環境変数かもしれないと思いました。crontab を介してスクリプトを実行すると、現在のユーザーの代わりに root ユーザーが使用されるため、環境を確認するために /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 ツールのエクスポートを通じてエクスポートされ、MANIFEST.MF ファイルは含まれません。パッケージ化ツール Ant を使用すると、デフォルトのビルドをパッケージ化できます。.xml ファイルにクラスパスを設定します

サードパーティの 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>

さらに、マニフェスト ファイルの作成で、次を追加します:


<!-- 这样就可以将第三方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

このように、プログラムが必要とするjarをシェルスクリプト内で指定する必要がなく、これが入っていれば環境変数の設定という煩わしい問題も発生しません。これが、より正式なものの動作方法です。

jar パッケージをシェルで直接実行するだけです: java -jar main project.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 メソッドが配置されているパッケージ名

以上がシェルスクリプトはJavaプログラムjarを実行するメソッドを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。