この記事では、主に 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 サイトの他の関連記事を参照してください。