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

服務(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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产白白视频在线观看2 | 俄罗斯大逼 | 超高清欧美同性videos | 男模chinesegayxxxx| 成人日批视频 | 国产亚洲精品综合在线网址 | 国产精品一区二区国产 | 美女任你摸 | 色综合久久六月婷婷中文字幕 | 69欧美另类xxxxx高清 | 国产免费不卡视频 | 美女脱了内裤让男生尿囗 | 欧美牛逼aa | 日本视频一区在线观看免费 | 亚洲天堂色视频 | 蜜桃88av| 大陆国产精品视频 | 色噜噜国产精品视频一区二区 | 外国xxx| 80s在线| 国产成人8x视频一区二区 | 91桃花 | 亚洲视频一区二区在线观看 | 国产精品成人自拍 | 成年人在线播放视频 | 60老妇性xxxxhd | 狠狠色狠狠色综合系列 | 国产高清自拍 | 久久久精品免费免费直播 | 精品国产一二三区在线影院 | 免费一级毛片在级播放 | 色综合色狠狠天天综合色hd | 亚洲 欧美 中文 日韩 另类 | 亚洲视频中文 | 香蕉久久夜色精品国产小优 | 俺去啦最新 | 乳 好大h| 久久精品无码人妻无码AV蜜臀 | 成人免费观看www视频 | 逼里逼里香 | 97午夜视频 |