一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 簡介Java程序的Shell腳本包裝

簡介Java程序的Shell腳本包裝

2019-12-26 13:26goldensun JAVA教程

這篇文章主要介紹了簡介Java程序的Shell腳本包裝,將Java運用于腳本程序當(dāng)中,有時或許是個不錯的主意~需要的朋友可以參考下

在許多Java工程中,經(jīng)常會看到帶有程序自定義參數(shù)調(diào)用Java命令的包裝shell腳本。例如,
 

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

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

?
1
$TIMEMACHINE_HOME/bin/scheduler.sh

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

run-java包裝腳本介紹

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

?
1
2
3
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被其他的腳本包裝,并且仍舊能夠添加額外的系統(tǒng)屬性以及classpath。

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

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

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

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

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

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


在開發(fā)中通過Maven使用 run-java

根據(jù)上面提到的示例,假設(shè)項目發(fā)布結(jié)構(gòu)如下:

?
1
2
3
$TIMEMACHINE_HOME
 +- bin/run-java
 +- lib/*.jar

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

?
1
mvn compile dependency:copy-dependencies

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

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

獲取 run-java 包裝腳本
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/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 parameters
JAVA_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 $CLASSPATH
RUN_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 classpath
RUN_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 is
JAVA_CMD=java
if [ -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
  fi
fi
 
# 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[@]}"
  fi
else
  # 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" "$@"
  fi
fi

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费观看欧美成人禁片 | 精品在线免费观看 | 亚洲精品AV无码永久无码 | 无码骚夜夜精品 | 99国产国人青青视频在线观看 | caoporm国产精品视频免费 | 免费精品国产在线观看 | 国产在线视频在线观看 | www.久久精品视频 | 5555国产在线观看精品 | 男生的j桶女人屁免费视频 男生操男生 | 成人夜视频寂寞在线观看 | 国产毛片在线高清视频 | 91免费播放人人爽人人快乐 | 大伊香蕉在线精品不卡视频 | 欧美午夜视频一区二区三区 | 日韩欧美国产在线 | 婷婷中文 | 好舒服好爽再快点视频 | 无人影院在线播放 | 国产精品久久国产精品99 gif | 射逼网 | 91国在线观看 | 亚洲白拍 | 亚洲欧美日韩综合在线播放 | 精品无码人妻一区二区免费AV | 久久亚洲精品中文字幕60分钟 | meyd–456佐山爱在线播放 | 干妞网免费视频 | 美女露奶奶 | 国产hd老头老太婆 | 美女隐私部位视频网站 | 精品国产福利在线 | 男女做受快插大片 | 色图图片 | 国产精品夜夜爽张柏芝 | 女人把私密部位张开让男人桶 | 视频一区二区三区在线 | 动漫美女隐私尿口图片 | 特黄特色大片免费视频播放 | 变态np虐高h |