많은 Java 프로젝트에서 프로그램 사용자 정의 매개 변수는 Java 명령 포장 쉘 스크립트를 호출하는 것으로 나타납니다. 예를 들어,
$ ant_home/bin/ant, $ groovy_home/bin/groovy
Timemachine 스케줄러 프로그램에서도 볼 수 있습니다.
$ etmachine_home/bin/scheduler.sh
이 포장 스크립트를 만드는 것은 지루하고 쉽습니다. 대부분의 문제는 프로그램에 올바른 클래스 경로를 설정하는 것입니다. 회사의 내부 프로젝트를 개발하는 경우 얽힌 경로와 환경 가변 문제에서 멀리 떨어져있을 수 있습니다. 그러나 오픈 소스 프로젝트의 경우 사람들은 포장을보다 유연하고 보편적으로 만들어야합니다. .BAT 버전의 대부분이 제공되었습니다. Windows DOS는 실제로 프로젝트 스크립트가 필요하지 않고 잔인하고 제한된 터미널입니다. 그러므로 나는 종종 다른 사람들이 가능한 한 Cygwi를 사용하도록 권장합니다. 적어도 그것은 진짜 강타 쉘이 있습니다. 다른 일반적인 문제는 이러한 포장이 곧 제어를 잃고 프로젝트 주변에 많은 중복 스크립트가 나타날 것이라는 점입니다.
Run-Java 포장 스크립트 소개
$ timemachine_home/bin/scheduler.sh의 코드가 표시되면 실제로 같은 디렉토리에서 Run-Java 스크립트라고합니다.
dir = $ (dirname $ 0) scheduler_home = $ dir/run -java -dscheduler.home = "$ scheduler_home"timemachine.tool.tool.dulerserver ""$@"
보시다시피, 우리의 Run -Java는 -D 옵션을 사용할 수 있으며 -CP 옵션을 사용할 수도 있습니다! 또한 메인 클래스 뒤에 이러한 옵션을 지정할 수 있습니다! 이로 인해 다른 스크립트가 Run-Java를 포장 할 수 있으며 여전히 추가 시스템 속성 및 클래스 경로를 추가 할 수 있습니다.
예를 들어, Timemachine은 그루비 라이브러리와 함께 제공되므로 간단히 말할 수 있습니다.
그루비 : $ timemachine_home/bin/run-java groovy.groovymain test.groovy, 전체 지점을 다시 다운로드하지 않고.
디렉토리에서 쉽게 사용할 수 있고 디렉토리를 확인한 다음 LIB 디렉토리에 JAR 패키지를 자동으로로드 할 수 있습니다. 이제 Groovy를 실행하기 위해 더 많은 항아리 백을 추가하려면 다음과 같이 -CP 옵션을 사용할 수 있습니다. CP 옵션 :
$ timemachine_home/bin/run-java -cp "$ home/apps/my-app/lib/*"groovy.groovymain test.groovy일반적으로 Java ClassPath를 설정하면 조심하지 않을 때는 종종 오류가 발생하지만 Run-Java로 미리 실행할 수 있습니다.
run_java_dry = 1 $ timemachine_home/bin/run-java -cp "$ home/apps/my-app/lib/*"groovy.groovymain test.groovy
명령 프롬프트 라인에서 위의 줄 코드 만 실행하면됩니다. 전체 출력으로 모든 옵션 및 매개 변수의 Java 명령을 출력합니다.
런 스크립트에는 다른 많은 옵션이 포함되어 있으며 주석을 보면 이해할 수 있습니다. 현재 스크립트는 Linux Bash 및 Windows Cygwin에서 실행될 수 있습니다.
개발중인 Maven을 통해 Run-Java를 사용하십시오
위에서 언급 한 예에 따르면 프로젝트 릴리스 구조가 다음과 같습니다.
$ timemachine_home +-bin/run-java +-lib/*
그러나 개발 과정에서 디렉토리는 무엇입니까? 공동 사례는 다음과 같습니다. 전체 프로젝트를 포장하거나 게시하는 대신 대상/클래스에서 최신 컴파일 된 코드를 실행하려고합니다. 이 경우 Run-Java를 사용할 수도 있습니다. 우선, 프로젝트에 빈/런 자바를 추가 한 다음 실행하십시오.
MVN 컴파일 종속성 : 카피 의존성
모든 JAR 파일은 대상/종속성에 따라 생성됩니다. 당신은 이것을하기 만하면됩니다. Run-Java는 이러한 디렉토리를 자동으로 감지하고 메인 클래스에 대한 올바른 클래스 경로를 만듭니다.
Eclipse를 사용하여 개발하는 경우 Target/Class 디렉토리가 항상 업데이트되며 Run-Java는 프로젝트 개발에서 보물이 될 수 있습니다.
Run-Java 포장 스크립트를 얻으십시오
#!/usr/bin/env bash ## Copyright 2012 Zemian Deng ## Apache 라이센스에 따라 라이센스가 부여 된 버전 2.0 ( "라이센스");# 생계를 준수 하여이 파일을 사용할 수 없습니다.# 라이센스의 사본 ## http://www.apache.org/licenses/2.0##에 해당되는 법률에 의해 요구되거나 서면에 동의하지 않는 한 라이센스에 따른 소프트웨어#는 "is as"기준,#에 배포됩니다. 어떤 종류의 보증 또는 조건이 없으면, 명시 적 또는 묵시적.# 라이센스에 따라 특정 언어에 대한 라이센스를 참조하십시오 응용 프로그램의 "빈"디렉토리에 위치한 것으로 가정합니다.# auto anymbolic 링크를 해결 하고이 응용 프로그램에 대한 도로 (이 스크립트에서 하나의 페인트). 파일 시스템의 어느 곳 에서나이 애플리케이션# 디렉토리를 참조하십시오. "config"# 및 "lib"dia "디렉토리는 또한 일반적인 Maven 프로젝트 출력 디렉토리를 추가합니다." Target/Test-Classes ",#"Target/Class "및"Target/Dependency "h.# run_java_no_parse = 1 모든 경로는 Cygwin/Unix 경로에 있어야하며,이 스크립트는 필요한 경우 Windows 경로를 자동 변환합니다. -CP "옵션, 기존 클래스 경로에 게시 할 옵션 ## 사용 :# run-Java [java_opts] <Java_Main_class> [-cp /more /classPath] [-dsysprop = value] ## 예 :# Run-Java 예제. hello # example.hello -dname = world # run -java org.junit.runner.junitcore exmple.hellotest -cp "c :/apps/lib/junit4.8.2/*"## 작성자 : Zemian Deng 03/09/ 2012 #이 실행 스크립트 d d ir (절대 경로로 해결) script_dir = $ (cd $ (dirname $ 0) && pwd) # 이것은이 스크립트가 live.app_dir = $ (cd $ script_dir/.. && pd)입니다. 응용 프로그램 DIR은 스크립트 DIR # DEFAULT PARAMETERSJAVA_HOME = $ {java_home : =/apps/jdk}에서 1 레벨입니다. 이것은 Java 개발의 홈 디렉토리입니다. = $ {run_java_opts : =} # java 옵션 (-xmx512m -xx : maxpermsize = 128m 등) run_java_debug = $ {run_java_debug : =} # 비어 있지 않으면, 전체 java 명령 줄을 실행하기 전에 print. : =} # 비어 있지 않으면 스크립트 인수에서 -d 및 -cp 옵션의 자동 구문 분석을 건너 뛰십시오. run_java_no_autocp = $ {run_java_autocp : =} # if noty, a auto setup java classpathrun_java_dry = $ {run_java_dry : =}} 비어 있지 않고 Java Commit을 실행하지 말고 # os 특별 지원은 true 또는 facese.cygwin = false로 설정됩니다. Java 실행 파일 Isjava_cmd = javaif [-d "$ java_home"; $ cygwin; #provide windows 디렉토리 변환 java_home_win = $ (cygpath -aw "$ java_home") app_dir_win = $ (cygpath -aw "$ app_dir"). $ run_java_cp; $ app_dir_win/target/class "; 그런 다음 run_java_cp ="$ run_java_win/target/class "; "$ app_dir_win/lib"; test -class "; -classes"; /*"; fi if [-d"$ app_dir/lib "]; 그런 다음 run_java_cp ="$ run_java_cp : $ app_dir/lib/*"; 따라서 사용자는 run_java_cp 및 run_java_opts# ey를 대신이 run-java 스크립트의 끝으로 전달할 수 있습니다 = deLlare -a new_args idx = 0 # all heftings in a art를 찾아 "-cp"및 "arg for"$@ "; [[-n $ found_cp]]; "]; # # cygpath는 CygPath를 사용할 수 없습니다. CygPath는 자동 확장"*"가 원하지 않습니다. 사용자는"-cp "옵션을 지정할 때 OS 경로를 사용해야합니다. #ARG = $ (. cygpath -w -a $ arg) run_java_cp = "$ run_java_cp; p ="$ run_java_cp : $ arg "fi found_cp = else $ arg in '-cp') found_cp = 1; '-d' *) run_java_opts ="$ run_java_opts $ arg "; *) new_args [$ idx] ="$ arg "lee t idx = $ idx +1 ;; esac fi done # display full java 명령. if [-n"$ run_java_debug "] || [-n "$ run_java_dry"; $ java_cmd "$ run_java_opts -cp"$ run_java_cp "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""째 # fielse # full java 명령. if [ - n "$ run_java_debug"] || run_java_dry "]; 그런 다음"$ java_cmd "$ run_java_opts -cp"$ run_java_cp ""$@"fifi