激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

簡介Java程序的Shell腳本包裝

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

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

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

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

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

?
1
$TIMEMACHINE_HOME/bin/scheduler.sh

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

run-java包裝腳本介紹

如果你看到 $TIMEMACHINE_HOME/bin/scheduler.sh 的代碼,你會看到它其實是在同目錄下循環調用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被其他的腳本包裝,并且仍舊能夠添加額外的系統屬性以及classpath。

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

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

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

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

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

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

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

?
1
mvn compile dependency:copy-dependencies

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

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

獲取 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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品一区自拍a毛片在线视频 | 羞羞视频一区二区 | 久久99网 | 色播一区 | 国产又白又嫩又紧又爽18p | 国产一级毛片不卡 | 最新中文字幕在线视频 | 综合网天天射 | 成人免费网站在线观看 | 伊人在线| 干一夜综合 | 中文字幕在线亚洲精品 | 久久久久亚洲a | 欧美黄色大片免费观看 | 亚洲av毛片久久久久 | 国产精品成人亚洲一区二区 | 色就色 综合偷拍区91网 | 91短视频网址 | 青青草成人免费视频在线 | 欧美另类综合 | 久久久久久久99 | 日本免费一区二区三区四区 | 欧美一级淫片a免费播放口 91九色蝌蚪国产 | 久久色网站 | 欧美三级美国一级 | 亚洲成人伊人 | 久久久久亚洲精品 | 日本一区二区在线看 | 欧美福利视频一区二区 | 4p嗯啊巨肉寝室调教男男视频 | 亚洲成人在线视频网 | 国产流白浆高潮在线观看 | 国内精品伊人久久 | 久久久久北条麻妃免费看 | 国产精品一区二区x88av | 欧美日本色 | 国产免费一级大片 | 午夜视频你懂的 | 色黄网站在线观看 | 国产一级毛片视频在线! | 国产午夜三级一区二区三桃花影视 |