亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

簡介Java程序的Shell腳本包裝

2019-11-26 15:05:57
字體:
來源:轉載
供稿:網友

在許多Java工程中,經常會看到帶有程序自定義參數調用Java命令的包裝shell腳本。例如,
 

$ANT_HOME/bin/ant, $GROOVY_HOME/bin/groovy

,甚至在我們的TimeMachine Scheduler程序中也能見到
 

$TIMEMACHINE_HOME/bin/scheduler.sh

編寫這些包裝腳本很無聊而且容易出錯。大多數的問題來自為程序設置正確的classpath。如果你正在為一個公司開發內部項目的話,那么你有可能遠離糾結的路徑以及環境變量問題。但是對于開源項目,人們需要使包裝更加靈活和通用。大多數甚至提供了.bat版本。Windows DOS確實是個野蠻且被限制的終端而不能很好的滿足你項目腳本需求。因此,我常鼓勵別人盡量還是多使用Cygwi。至少它具備一個真實的bash shell。其他常見的問題就是這些包裝很快就會失去控制而且在你的項目各處都會出現很多冗余腳本。

run-java包裝腳本介紹

如果你看到 $TIMEMACHINE_HOME/bin/scheduler.sh 的代碼,你會看到它其實是在同目錄下循環調用run-java腳本。
 

DIR=$(dirname $0)SCHEDULER_HOME=$DIR/..$DIR/run-java -Dscheduler.home="$SCHEDULER_HOME" timemachine.scheduler.tool.SchedulerServer "$@"

正如你看到的,我們的 run-java 可以使用 -D 選項,不僅這樣,它同樣也能使用 -cp 選項!而且,你還能在main class后面指定這些選項!這樣能夠使得run-java被其他的腳本包裝,并且仍舊能夠添加額外的系統屬性以及classpath。

例如,TimeMachine 附帶了 Groovy 庫,所以你可以簡單的像這樣調用
 

groovy:$TIMEMACHINE_HOME/bin/run-java groovy.ui.GroovyMain test.groovy
,而不用再次下載整個分支。

你可以很方便地在任何目錄下使用,它確認自己的目錄然后可以自動加載lib目錄下的任何jar包?,F在如果你想要附加更多的jar包來運行Groovy的話,可以如下使用 -cp 選項:
 

$TIMEMACHINE_HOME/bin/run-java -cp "$HOME/apps/my-app/lib/*" groovy.ui.GroovyMain test.groovy
通常如果你設置java classpath不夠小心時會經常導致錯誤,但是使用 run-java 可以預先運行一次:
 
RUN_JAVA_DRY=1 $TIMEMACHINE_HOME/bin/run-java -cp "$HOME/apps/my-app/lib/*" groovy.ui.GroovyMain test.groovy

你只需在命令提示行中運行上面一整行代碼即可。它將輸出完整的附帶所有選項和參數的java命令。

run-script還包含很多其它的選項,你可以通過查看其注釋了解。當前的腳本能夠在任何的Linux bash和Windows Cygwin中運行。


在開發中通過Maven使用 run-java

根據上面提到的示例,假設項目發布結構如下:

$TIMEMACHINE_HOME +- bin/run-java +- lib/*.jar

但是在開發過程中目錄會是怎樣呢?一個常見的用例便是:你希望能夠運行target/classes下最新編譯的代碼而不是將整個項目打包或者發布。你同樣可以在此種情況下使用 run-java 。首先,簡單的將 bin/run-java 添加進你的項目,然后運行
 

mvn compile dependency:copy-dependencies

將會在target/dependency下生成所有的jar文件。就只需要做這些。run-java將自動的檢測這些目錄,并為你的main class創建正確的classpath。

如果你使用Eclipse來開發,那么你的target/classes目錄將總是在更新的,run-java便能成為你項目開發中的瑰寶。

獲取 run-java 包裝腳本
 

#!/usr/bin/env bash## Copyright 2012 Zemian Deng## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License. # A wrapper script that run any Java6 application in unix/cygwin env.## This script is assumed to be located in an application's "bin" directory. It will# auto resolve any symbolic link and always run in relative to this application# directory (which is one parent up from the script.) Therefore, this script can be# run any where in the file system and it will still reference this application# directory.## This script will by default auto setup a Java classpath that picks up any "config"# and "lib" directories under the application directory. It also will also add a# any typical Maven project output directories such as "target/test-classes",# "target/classes", and "target/dependency" into classpath. This can be disable by# setting RUN_JAVA_NO_PARSE=1.## If the "Default parameters" section bellow doesn't match to user's env, then user# may override these variables in their terminal session or preset them in shell's# profile startup script. The values of all path should be in cygwin/unix path,# and this script will auto convert them into Windows path where is needed.## User may customize the Java classpath by setting RUN_JAVA_CP, which will prefix to existing# classpath, or use the "-cp" option, which will postfix to existing classpath.## Usage:# run-java [java_opts] <java_main_class> [-cp /more/classpath] [-Dsysprop=value]## Example:# run-java example.Hello# run-java example.Hello -Dname=World# run-java org.junit.runner.JUnitCore example.HelloTest -cp "C:/apps/lib/junit4.8.2/*"## Created by: Zemian Deng 03/09/2012 # This run script dir (resolve to absolute path)SCRIPT_DIR=$(cd $(dirname $0) && pwd) # This dir is where this script live.APP_DIR=$(cd $SCRIPT_DIR/.. && pwd)  # Assume the application dir is one level up from script dir. # Default parametersJAVA_HOME=${JAVA_HOME:=/apps/jdk}  # This is the home directory of Java development kit.RUN_JAVA_CP=${RUN_JAVA_CP:=$CLASSPATH}  # A classpath prefix before -classpath option, default to $CLASSPATHRUN_JAVA_OPTS=${RUN_JAVA_OPTS:=}   # Java options (-Xmx512m -XX:MaxPermSize=128m etc)RUN_JAVA_DEBUG=${RUN_JAVA_DEBUG:=}   # If not empty, print the full java command line before executing it.RUN_JAVA_NO_PARSE=${RUN_JAVA_NO_PARSE:=} # If not empty, skip the auto parsing of -D and -cp options from script arguments.RUN_JAVA_NO_AUTOCP=${RUN_JAVA_NO_AUTOCP:=} # If not empty, do not auto setup Java classpathRUN_JAVA_DRY=${RUN_JAVA_DRY:=}    # If not empty, do not exec Java command, but just print # OS specific support. $var _must_ be set to either true or false.CYGWIN=false;case "`uname`" in CYGWIN*) CYGWIN=true ;;esac # Define where is the java executable isJAVA_CMD=javaif [ -d "$JAVA_HOME" ]; then  JAVA_CMD="$JAVA_HOME/bin/java"fi # Auto setup applciation's Java Classpath (only if they exists)if [ -z "$RUN_JAVA_NO_AUTOCP" ]; then  if $CYGWIN; then    # Provide Windows directory conversion    JAVA_HOME_WIN=$(cygpath -aw "$JAVA_HOME")    APP_DIR_WIN=$(cygpath -aw "$APP_DIR")     if [ -d "$APP_DIR_WIN/config" ]; then RUN_JAVA_CP="$RUN_JAVA_CP;$APP_DIR_WIN/config" ; fi    if [ -d "$APP_DIR_WIN/target/test-classes" ]; then RUN_JAVA_CP="$RUN_JAVA_CP;$APP_DIR_WIN/target/test-classes" ; fi    if [ -d "$APP_DIR_WIN/target/classes" ]; then RUN_JAVA_CP="$RUN_JAVA_CP;$APP_DIR_WIN/target/classes" ; fi    if [ -d "$APP_DIR_WIN/target/dependency" ]; then RUN_JAVA_CP="$RUN_JAVA_CP;$APP_DIR_WIN/target/dependency/*" ; fi    if [ -d "$APP_DIR_WIN/lib" ]; then RUN_JAVA_CP="$RUN_JAVA_CP;$APP_DIR_WIN/lib/*" ; fi  else    if [ -d "$APP_DIR/config" ]; then RUN_JAVA_CP="$RUN_JAVA_CP:$APP_DIR/config" ; fi    if [ -d "$APP_DIR/target/test-classes" ]; then RUN_JAVA_CP="$RUN_JAVA_CP:$APP_DIR/target/test-classes" ; fi    if [ -d "$APP_DIR/target/classes" ]; then RUN_JAVA_CP="$RUN_JAVA_CP:$APP_DIR/target/classes" ; fi    if [ -d "$APP_DIR/target/dependency" ]; then RUN_JAVA_CP="$RUN_JAVA_CP:$APP_DIR/target/dependency/*" ; fi    if [ -d "$APP_DIR/lib" ]; then RUN_JAVA_CP="$RUN_JAVA_CP:$APP_DIR/lib/*" ; fi  fifi # Parse addition "-cp" and "-D" after the Java main class from script arguments# This is done for convenient sake so users do not have to export RUN_JAVA_CP and RUN_JAVA_OPTS# saparately, but now they can pass into end of this run-java script instead.# This can be disable by setting RUN_JAVA_NO_PARSE=1.if [ -z "$RUN_JAVA_NO_PARSE" ]; then   # Prepare variables for parsing  FOUND_CP=  declare -a NEW_ARGS  IDX=0     # Parse all arguments and look for "-cp" and "-D"  for ARG in "$@"; do    if [[ -n $FOUND_CP ]]; then       if [ "$OS" = "Windows_NT" ]; then        # Can't use cygpath here, because cygpath will auto expand "*", which we do not        # want. User will just have to use OS path when specifying "-cp" option.          #ARG=$(cygpath -w -a $ARG)        RUN_JAVA_CP="$RUN_JAVA_CP;$ARG"      else        RUN_JAVA_CP="$RUN_JAVA_CP:$ARG"      fi      FOUND_CP=    else      case $ARG in      '-cp')        FOUND_CP=1        ;;      '-D'*)        RUN_JAVA_OPTS="$RUN_JAVA_OPTS $ARG"        ;;      *)        NEW_ARGS[$IDX]="$ARG"        let IDX=$IDX+1        ;;      esac    fi  done       # Display full Java command.  if [ -n "$RUN_JAVA_DEBUG" ] || [ -n "$RUN_JAVA_DRY" ]; then    echo "$JAVA_CMD" $RUN_JAVA_OPTS -cp "$RUN_JAVA_CP" "${NEW_ARGS[@]}"  fi     # Run Java Main class using parsed variables  if [ -z "$RUN_JAVA_DRY" ]; then    "$JAVA_CMD" $RUN_JAVA_OPTS -cp "$RUN_JAVA_CP" "${NEW_ARGS[@]}"  fielse  # Display full Java command.  if [ -n "$RUN_JAVA_DEBUG" ] || [ -n "$RUN_JAVA_DRY" ]; then    echo "$JAVA_CMD" $RUN_JAVA_OPTS -cp "$RUN_JAVA_CP" "$@"  fi     # Run Java Main class  if [ -z "$RUN_JAVA_DRY" ]; then    "$JAVA_CMD" $RUN_JAVA_OPTS -cp "$RUN_JAVA_CP" "$@"  fifi

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看久久av| 色小说视频一区| 91精品国产91久久| 国产精品一区二区久久| 亚洲最大av网| 92福利视频午夜1000合集在线观看| 亚洲免费视频一区二区| zzjj国产精品一区二区| 一区二区三区视频在线| 亚洲激情 国产| 日韩精品极品在线观看| 欧美日韩成人黄色| 国产精品久久久久久久久久免费| 日韩一区二区久久久| 美日韩精品视频免费看| 国产精品久久久久影院日本| 96sao精品视频在线观看| 97久久精品人搡人人玩| 国产精品十八以下禁看| 91色视频在线导航| 亚洲综合国产精品| 精品无码久久久久久国产| 亚洲激情久久久| 欧美高清不卡在线| 国产裸体写真av一区二区| 中文字幕成人精品久久不卡| 精品国产依人香蕉在线精品| 亚洲精品日产aⅴ| 国产精品久久久久久久久久久新郎| 黑人巨大精品欧美一区免费视频| 国产精品久久久久久久久久东京| 亚洲电影成人av99爱色| 精品国产一区二区三区四区在线观看| 久久精品视频在线播放| 奇米成人av国产一区二区三区| 精品日本高清在线播放| 午夜精品久久久久久久男人的天堂| 亚洲美女在线视频| 精品亚洲国产成av人片传媒| 国产精品视频男人的天堂| 国产成人综合精品在线| 精品久久久久久久久中文字幕| 国产日韩视频在线观看| 国产aⅴ夜夜欢一区二区三区| 97在线视频观看| 2018中文字幕一区二区三区| 日韩最新免费不卡| 久久久久久国产精品三级玉女聊斋| 日韩av手机在线| 国产亚洲日本欧美韩国| 日韩成人高清在线| 在线不卡国产精品| 成人免费网站在线| 日韩欧美综合在线视频| 欧美中文字幕视频| 亚洲电影中文字幕| 亚洲女同精品视频| 成人国产亚洲精品a区天堂华泰| 精品国产一区二区三区四区在线观看| 国产成人高潮免费观看精品| 不卡伊人av在线播放| 主播福利视频一区| 精品中文字幕视频| 亚洲国产毛片完整版| 日韩在线视频二区| 亚洲xxxxx电影| 欧美专区福利在线| 成人免费在线视频网站| 亚洲老头同性xxxxx| 久久久人成影片一区二区三区| 亚洲永久免费观看| 两个人的视频www国产精品| 欧美在线激情网| 日韩不卡在线观看| 日韩在线观看免费高清完整版| www.xxxx精品| 91在线精品视频| 欧美小视频在线| 91日本视频在线| 一区二区三区视频免费| 亚洲乱码一区av黑人高潮| 97国产精品人人爽人人做| 久久精品国产久精国产思思| 日韩电影免费在线观看| 午夜精品美女自拍福到在线| 日韩精品视频免费专区在线播放| 色樱桃影院亚洲精品影院| 欧美综合第一页| 欧美成在线视频| 国产精品久久9| 亚洲欧美激情一区| 亚洲第一页在线| 亚洲精品资源在线| 国产精品三级久久久久久电影| 国产成人精品电影久久久| 欧美激情精品久久久久久变态| 精品国产福利在线| 国产日韩欧美一二三区| 日本高清不卡的在线| 日韩在线观看网站| 在线成人激情黄色| 国产精品第一页在线| 国产精品无av码在线观看| 91久久国产婷婷一区二区| 国产精品国产三级国产aⅴ浪潮| 欧美性xxxx在线播放| 国产亚洲欧美日韩精品| 亚洲一区二区久久久久久| 欧美一级视频一区二区| 日产精品久久久一区二区福利| 国模gogo一区二区大胆私拍| 国产色综合天天综合网| 成人福利免费观看| 97精品欧美一区二区三区| 成人久久18免费网站图片| 欧美插天视频在线播放| 日韩久久精品电影| 日本精品视频在线播放| 欧美最猛性xxxx| 国产精品91视频| 中文字幕在线日韩| 亚洲成人久久久| 午夜精品福利电影| 亚洲精品中文字幕女同| 亚洲欧美综合图区| 国产精品直播网红| 精品视频www| 欧美激情一级二级| 日韩一区视频在线| 大伊人狠狠躁夜夜躁av一区| 亚洲激情成人网| 亚洲全黄一级网站| 欧美激情综合色综合啪啪五月| 国产欧美精品xxxx另类| 国产精品亚洲片夜色在线| 日本欧美一二三区| 欧美超级免费视 在线| 国产精品视频精品| 在线观看免费高清视频97| 北条麻妃一区二区在线观看| 91精品久久久久久综合乱菊| 韩国三级日本三级少妇99| 精品视频中文字幕| 一色桃子一区二区| 国产精品青青在线观看爽香蕉| 日本高清视频精品| 国产精品羞羞答答| 久久精品国产综合| 成人激情电影一区二区| 日韩成人中文字幕在线观看| 久热精品视频在线观看| 永久免费看mv网站入口亚洲| 国产成人亚洲综合91精品| 国产专区欧美专区| 亚洲欧美色婷婷| 亚洲男人天堂视频| 亚洲无限av看| 国产精品69精品一区二区三区| 亚洲精品福利在线| 日韩在线视频观看| 欧美日韩在线观看视频小说| 亚洲视频999| 欧美激情视频三区| 色狠狠av一区二区三区香蕉蜜桃|