Apache ANT Guide 요약 : Apache ANT Guide 작성자 : 최지웅 Article요약
아파치 그룹에서 내놓은 빌더툴인 ant1.4.1버젼을 이용하여 각각의 태그와 그에 대한 내용을 공부해보도록 하죠.. *^^* 이툴을 이용하여 java compile및 ejb-jar파일의 생성, deploy및 sql파일의 처리, database에 대한 접속을 통하여 많은 일들을 할수 있도록 구성되어져 있습니다. 각 사용법과 샘플을 통하여 사용법을 익혀보도록 합시다
Article 내용 **************************** * Ant 시작하기 * ****************************
.인스톨하기 - 아래의 사이트로부터 다운받는다. http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/
- 권장사항 jdk1.2버젼이상을 추천한다. - Windows 설치된 디렉토리가 c:\ant\. 로 가정했을경우에
set ANT_HOME=c:\ant set JAVA_HOME=c:\jdk1.3.1 set PATH=%PATH%;%ANT_HOME%\bin
의 환경변수를 잡아주도록 한다.
- Unix(bash)
export ANT_HOME=/usr/local/ant export JAVA_HOME=/usr/local/jdk1.3.1 export PATH=${PATH}:${ANT_HOME}/bin
**************************** * Ant 실행하기 * ****************************
Command-line option
ant [options] [target [target2 [target3] ...]] Options: -help print this message -projecthelp 프로젝트에 필요한 도움을 보여준다 -version 현재 버젼은 보여준다 -quiet 아무런 표시없이 build한다 -verbose verbose모드를 실시한다. -debug dubugging을 한다. -emacs 로깅정보를 만들어낸다 -logfile file 주어진 파일로 로그를 출력한다. -logger classname 해당클래스를 이용하여 로깅을 수행한다. -listener classname 리스너클래스를 추가한다. -buildfile file 대상 build파일을 정의한다. -find file 루트로부터 buildfile을 찾는다. -Dproperty=value build설정에 필요한 프로퍼티를 찾는다.
ant를 batch파일 없이 직접 실행하고 싶다면 아래와 같은 옵션을 이용하여 실행하면 된다
java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target]
************************************* * SimpleBuild파일 만들어보기 * *************************************
상위 tag부터 소개한다.
<project name="" default="" basedir=""></project>
name -- 이 프로젝트의 설정이름을 기록한다.( 안써두 무방 ) default -- target이 지정되지 않았을때 default target으로 쓴다. (반드시 기술) basedir -- 현재 build를 사용할 디렉토리를 설정한다. 보통 현재디렉토리를 많이 사용한다.(안써두 됨)
================================================================ <target></target>
현재 build되는 target은 다른 target에 의존하여 build되어질수 있다.
그럴경우에 이 tag를 이용하여 build하도록 한다.
<target name="A"/> -- 현재 build되어진다. <target name="B" depends="A"/> -- A가 정상적으로 이루어져야만 B의 build가 이루어진다. <target name="C" depends="B"/> -- 위와 같은 방법으로 recursive하게 이루어진다. <target name="D" depends="C,B,A"/>
이해가 금방 되리라 본다.
여기서 조합으로 if-unless를 사용할수도 있다.
1: <target name="build-module-A" if="module-A-present"/> 2: <target name="build-own-fake-module-A" unless="module-A-present"/> 위의 내용에서 module-A-present에 따라서 두가지 형태로 분기되면 반드시 한가지는
실행되어지는 모습을 볼수 있다. module-A-present가 성공했을경우 1번을 수행하고,
실패했을경우는 2번으로 분기되어서 실행될수 있도록 한다.
target은 다음과 같은 속성을 갖는다. name -- target의 이름.(반드시 기술하여야 함) depends -- 콤마(,)로 구분하며 다른 target에 영향을 받으며 build되어진다.(안써두 됨) if -- 현재 target이 실행될것인지를 결정(안써두 됨) unless -- unless의 target이 실패했을경우 처리되는 부분(안써두 됨) description -- description(안써두 됨)
************************************* * Properties의 사용 * ************************************* <property name="foo.dist" value="dist"/> dist란 value를 foo.dist로 setting한다.
<property file="foo.properties"/> foo.properties파일을 읽어들여 build.xml파일의 프로퍼티로 세팅한다.
<property resource="foo.properties"/>
<property file="${user.home}/.ant-global.properties"/> 속성을 겹쳐서 프로퍼티 파일을 읽어들일수도 있다.
************************************* * Path-Link의 사용 * ************************************* <classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath>
클래스패스링크를 사용하여 path 또는 classpath를 추가시킬수 있다. 패스를 계속적으로 추가하고자 할때는 ; or :를 이용하여 추가할수 있다.
위의 내용을 아래와 같이 요약하여 한줄에 추가시킬수 있다.
<classpath path="${classpath}"/>
************************************* * Referencing하기 * *************************************
<project ... > <target ... > <rmic ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </rmic> </target>
<!-- =====위의 내용은 rmic를 이용하여 클래스패스를 이용한 컴파일을 시도하기 위한 스크립트이다 -->
<target ... > <javac ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </javac> </target>
<!-- =====위의 내용은 javac를 이용하여 클래스패스를 이용한 컴파일을 시도하기 위한 스크립트이다 --> </project>
위의 샘플에서는 불필요한 classpath가 계속 쓰여지고 있다. 안좋은 방법이므로 아래와같이 다시 쓸수 있다.
<project ... > <path id="project.class.path"> <----- path-id를 지정해놓고서 아래쪽에서 패스를 참조하도록 한다. <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </path>
<target ... > <rmic ...> <classpath refid="project.class.path"/> <--- 위의 ref-id로 설정해 놓은 패스를 참조하여 사용하도록 한다. </rmic> </target>
<target ... > <javac ...> <classpath refid="project.class.path"/> </javac> </target> </project>
************************************* * Sample예제 * *************************************
--현재 디렉토리 구성을 보도록 하자. WeblogicBuildTest/ WeblogicBuildTest/src WeblogicBuildTest/src/Echo.java WeblogicBuildTest/src/EchoHome.java WeblogicBuildTest/src/EchoEJB.java WeblogicBuildTest/src/EchoClient.java
--아래의 내용을 이용하여 weblogicaux.jar를 이용하여 build를 시도한다. -- 컴파일에 성공하면 현재 클래스파일들을 이용하여 MyProject-현재날짜.jar파일로 묶는다
도스명령 : ant -Dweblogic.classpath=c:\weblogic\lib\weblogicaux.jar
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build --> <property name="src" value="src"/> <property name="build" value="build"/> <property name="dist" value="dist"/>
<property name="weblogicaux.jar" value="${weblogic.home}/lib/weblogicaux.jar" />
<target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target>
<target name="compile" depends="init"> <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}" classpath="${weblogic.classpath}:${build}" /> </target>
<target name="dist" depends="compile"> <!-- Create the distribution directory --> <mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> </target>
<target name="clean"> <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
================================================== ================================================== Directory Base Tasks ================================================== ==================================================
1. Patterns
exclusion과 inclusion에 대한 패턴을 정의 할수 있으며,
우리가 일반적으로 사용하는 wild card *, ?를 이용하여 표현할 수 있다.
예를 들면 *.java 는 .java의 확장자를 가진 모든 파일을 표현한다. x.java, FooBar.java 등등
*는 파일에 대한 내용을 보여주고자 할때 사용하는 패턴이며
**는 디렉토리의 이름을 이용하여 표현할수 있게끔 만드는 확장자 이름이다. 또한 0개 이상의 디렉토리를 표현하고자 할때 이패턴을 사용하게 된다.
예를 들어 /test/**는 test라는 디렉토리 안의 파일 및 다른 서브디렉토리를 모두 포함하는 wildcard로서 동작된다.
Example Pattern
**/CVS/* : CVS/Repository org/apache/CVS/Entries org/apache/jakarta/tools/ant/CVS/Entries But not: org/apache/CVS/foo/bar/Entries (foo/bar/ 부분이 일치하지 않는다.) -------------------------------------------- org/apache/jakarta/** : org/apache/jakarta/tools/ant/docs/index.html org/apache/jakarta/test.xml But not: org/apache/xyz.java -------------------------------------------- org/apache/**/CVS/* : org/apache/CVS/Entries org/apache/jakarta/tools/ant/CVS/Entries But not: org/apache/CVS/foo/bar/Entries ---------------------------------------------
예제
<copy todir="${dist}"> <fileset dir="${src}" includes="**/images/*" excludes="**/*.gif" /> </copy>
src의 하위 디렉토리에서 **/images/* 패턴에 적용되는 것을 모두 복사하여 dist디렉토리로 복사한다. (현재 디렉토리에 있는 모든 *.gif인 파일은 제외하구 옮긴다.
************************************* * FileCopy하기 * *************************************
새로운 Fileset이나 file을 이용하여 파일/디렉토리로 카피할수 있다.
Paramters : file -- 카피할 파일을 지정한다. 하나 또는 하나이상의 file or fileset을 지정해야 한다. preservelastmodified -- 원본파일과 같을 경우 카피를 시도한다. 최종 수정본과 현재 대상본이 같아야 한다.(default : no) tofile -- 카피되어질 파일이름을 지정한다. tofile or todir이 사용되어진다. fileset을 사용하게 된다면 todir로만 사용되어져야 한다. todir -- 카피되어질 디렉토리를 설정한다 overwrite -- 대상디렉토리에 해당 파일이 존재할경우 overwrite할지 새롭게 만들지를 결정한다. Defaults to "no". filtering -- 카피도중에 필터를 사용하여 카피를 할것인지를 결정한다. Defaults to "no". flatten -- 소스디렉토리의 하위구조를 무시하고 모든 내용을 한디렉토리로만 복사한다. Defaults to "no". includeEmptyDirs -- FileSet에 포함된 빈 디렉토리도 카피할수 있도록 한다. Defaults to "yes".
Examples ------------------------------------------------ 1개의 파일 복사하기 <copy file="myfile.txt" tofile="mycopy.txt"/>
파일을 디렉토리로 복사하기 <copy file="myfile.txt" todir="../some/dir/tree"/>
한디렉토리를 다른 디렉토리로 복사하기 <copy todir="../new/dir"> <fileset dir="src_dir"/> </copy>
src_dir밑의 .java파일을 제외한 것을 ../dest/dir디렉토리로 복사
<copy todir="../dest/dir" > <fileset dir="src_dir" > <exclude name="**/*.java"/> </fileset> </copy>
<copy todir="../dest/dir" > <fileset dir="src_dir" excludes="**/*.java"/> </copy>
디렉토리에 있는 파일들을 대상으로 확장자 bak를 붙여서 복사하도록 한다.
<copy todir="../backup/dir" > <fileset dir="src_dir" /> <mapper type="glob" from="*" to="*.bak"/> </copy>
원본 디렉토리의 TITLE이라는 문자를 Foo Bar로 대치하여 복사한다.
<copy todir="../backup/dir" > <fileset dir="src_dir" /> <filterset> <filter token="TITLE" value="Foo Bar" /> </filterset> </copy>
유사 태그로서 copydir, copyfile태그가 있다.
************************************* * Delete하기 * ************************************* 하나의 파일을 지우거나, 서브디렉토리 및 하나이상의 fileset등을 이용하여 지울수 있도록 한다.
Parameter는 CopyFile과 유사하다. 추가가 된것을 보도록 하자.
failonerror -- 파일 삭제에 실패했을 경우, build를 멈추고 현재의 스크린에 해당 사항을 보여주도록 한다. includeEmptyDirs -- 빈디렉토리까지 모두 삭제하도록 한다.
Examples
<delete file="/lib/ant.jar"/> /lib/ant.jar 을 삭제한다.
<delete dir="lib"/> lib디렉토리의 모든 파일 및 서브디렉토리를 가차없이 삭제한다.
<delete> <fileset dir="." includes="**/*.bak"/> </delete>
현재 디렉토리및 하위디렉토리에서 bak의 확장자를 가진 파일을 모두 삭제한다.
<delete includeEmptyDirs="true" > <fileset dir="build" /> </delete>
build자신을 포함하고 있는 디렉토리이면 모든 파일과 하위디렉토리를 삭제하도록 한다.
************************************* * Echo * ************************************* 현재 시스템 콘솔이나 파일로 메시지를 출력하도록 한다.
message -- 보여줄 메시지를 기술한다. file -- 이 메시지를 해당파일로 출력하도록 한다.(default no) append -- 현재 파일이 존재하고있으면 추가시키는 모드를 설정한다.
Examples <echo message="Hello world"/> <echo> 요부분은 해당 콘솔에 나오는 글자입니다.!!! 바보야~~ ㅋㅋ </echo>
************************************* * JAR파일 만들기 * ************************************* 해당 task를 이용하여 jar파일을 생성할수도 있다. ZIP파일을 묶는 task과 같은 형식으로 동작하여 각각의 묶일 파일이나 디렉토리 모두를 지정할수 있다.
<jar> </jar>tag에 반드시 들어가야하는 속성은 jarfile이란 태그로서 해당 jar파일의 이름을 지칭한다. jarfile -- 생성할 jar-file basedir -- jar-file을 생성할 기본디렉토리를 지정. Default No compress -- 저장된 데이터뿐만 아니라 압축된 형태까지 모두 묶는다, No encoding -- 묶을 파일의 character encoding set을 지정한다.웬만하면 바꾸지 말기 filesonly -- 엔트리에 들어있는 파일만 묶는다. No includes -- ,(comma)로 분리되어 있는 패턴파일 리스트를 반드시 포함하여 묶는다. No includesfile -- 각각에 패턴에 해당하는 파일을 이용하여 묶도록 한다. No excludes -- 파일패턴에 대한 파일 제외하고 묶는다. No excludesfile -- No defaultexcludes -- defaultexclude를 사용할지 안할지를 결정한다. No manifest -- manifest파일을 사용하도록 한다. No update -- 만약에 해당 jar파일이 존재한다면 update할것인지 overwrite할것인지를 결정한다. No whenempty -- 패턴에 매핑되는 파일이 없더라도 동작을 할것인지를 결정한다. No
Examples :
<jar jarfile="${dist}/lib/app.jar" basedir="${build}/classes"/> ${build}/classes디렉토리에 있는 모든 파일들을 ${dist}/lib 디렉토리의 app.jar란 이름으로 압축한다.
----------------------------------------------------------- <jar jarfile="${dist}/lib/app.jar" basedir="${build}/classes" excludes="**/Test.class" /> ${build}/classes디렉토리의 Test.class를 제외한 모든 파일들을 ${dist}/lib디렉토의 app.jar파일의 이름으로 압축한다.
------------------------------------------------------------ <jar jarfile="${dist}/lib/app.jar" basedir="${build}/classes" includes="mypackage/test/**" excludes="**/Test.class" /> ${build}/classes디렉토리에 있는 모든 파일들을 ${dist}/lib 디렉토리의 app.jar란 이름으로
묶는다. 다 묶는것이아니라 ${build}/classes/mypackage/test밑의 파일만을 사용하며 Test.class를 제외한다.
<jar jarfile="${dist}/lib/app.jar"> <fileset dir="${build}/classes" excludes="**/Test.class" /> <fileset dir="${src}/resources"/> </jar>
${build}/classes와 ${src}/resource디렉토리를 app.jar라는 이름으로 함께 묶는데
Test.class를 제외하여 묶는다 --------------------------------------------------------------------------------
************************************* * Java Execute * ************************************* 이제 tag를 이용한 java명령을 실행시켜보도록 하자.
우선 해당 tag안에 들어가는 parameter부터 확인해 보도록 하자. 한가지 조심해야 할것이 있는데 프로그램코딩중에 System.exit()부분을 잘 써야 한다 만약 그것을 써버리게 되면 ant또한 같은 vm상에서 동작중이므로 ant까지 빠져나와버리는 경우가 발생할수 있다.
classname -- 실행시킬 자바 클래스명을 기술한다. jar또는 class name이 될수 있다. jar -- 실행시킬 jar파일의 위치를 표시한다.만약 이 옵션이 선택되어 진다면 반드시 Fork의 속성을 true로 만들어야 한다. args -- 실행되어질 클래스의 argument를 지정한다. deprecate되었으면 현재는 <arg>태그를 사용한다. No classpath -- 사용할 클래스패스를 지정한다. No classpathref -- 클래스패스를 사용하는데 PATH에 정의되어진 reference를 이용한다. No fork -- 다른 vm상에서 클래스를 trigger하고 싶다면 설정한다. No jvm -- JVM에 대한 option command를 사용한다. fork옵션이 비활성화 되었으면 무시된다. No jvmargs -- fork된 VM에 대한 argument를 사용한다. deprecated됐으며 <jvmarg> 를 사용한다. No maxmemory -- fork된 vm에 대한 최대 메로리값을 할당한다. No failonerror -- 0이 아닌 다른 returncode가 오게 되면 build process를 중지한다. 반드시 fork가 true일때만 사용가능하다. No dir -- The directory to invoke the VM in. No output -- 지정된 파일을 output으로 사용한다. No
Example <java classname="test.Main" > <arg value="-h"/> <classpath> <pathelement location="\test.jar"/> <pathelement path="${java.class.path}"/> </classpath> </java>
Examples
<java classname="test.Main"/> <java classname="test.Main" fork="yes" > <sysproperty key="DEBUG" value="true"/> <arg value="-h"/> <jvmarg value="-Xrunhprof:cpu=samples,file=log.txt,depth=3"/> </java>
************************************* * Java Compile * *************************************
javac를 이용하여 자바프로그램을 컴파일할 수 있도록 하는 태그로서 각종 옵션들이 이쪽에 들어가게 된다.
Parameters ==================== srcdir -- 컴파일대상의 자바파일들의 위치를 나타낸다. destdir -- compile된 클래스 파일들이 들어가게될 디렉토리를 지칭한다. No includes -- ,(comma)로 분리된 파일의 패턴을 이용하여 포함된 파일들을 모두 컴파일한다. No includesfile -- include패턴에 명명된 파일을 포함하여 compile한다. No excludes -- exclude패턴에 명명된 제외을 포함하여 모두 compile한다. No excludesfile -- exclude패턴에 명명된 제외을 포함하여 compile한다. No defaultexcludes -- default excludes를 사용하여 compile한다. No classpath -- 클래스 패스를 사용할 경우에 기술한다. No bootclasspath -- bootstrap class file의 위치를 기술한다. No classpathref -- PATH reference에 주어진 클래스패스를 사용하여 compile한다. No bootclasspathref -- PATH reference에 주어진 bootstrap 클래스패스를 사용하여 compile한다. No extdirs -- 설치된 extension의 위치. No encoding -- source file encoding. No nowarn -- compiler로 -nowarn옵션을 전달한다. No debug -- compile time debug모드로 설정한다 No optimize -- optimize옵션을 사용한다. no deprecation -- deprecation옵션을 사용한다. No target -- 명시된 VM을 사용하여 class파일을 생성하도록 한다. No verbose -- 출력을 verbose모드로 설정한다. No depend -- dependenty-tracking compiler모드를 사용한다. No includeAntRuntime -- Ant run-time lib를 포함하여 compile한다. default = yes, required No includeJavaRuntime -- 실행되는 VM으로부터 run-time lib를 포함하여 컴파일한다. defaults to no. Required No fork -- 외부의 JDK compiler를 사용하여 javac를 수행한다. defaults to no. required No memoryInitialSize -- VM상의 초기 메모리 사이즈를 설정한다. (examples: 83886080, 81920k, or 80m) , required No memoryMaximumSize -- VM상의 최대 메모리 사이즈를 정한다. externally javac일 경우 사용되면 다른경우는 무시된다. (examples: 83886080, 81920k, or 80m) No failonerror -- 컴파일 에러가 발생했을 경우 계속 컴파일을 시도할것인지를 결정. defaults to true. required No source -- command line switch로 -source를 사용한다. No
Examples <javac srcdir="${src}" destdir="${build}" classpath="xyz.jar" debug=on" /> ${src} directory에 있는 모든 .java파일을 xyz.jar를 이용하여 compile한후 debug 정보는 연 상황에서 build디렉토리에 class파일들을 위치시킨다.
------------------------------------------------------------------------- <javac srcdir="${src}" destdir="${build}" includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**" classpath="xyz.jar" debug=on" />
${src} directory의 파일들을 컴파일하는데 조건은 xyz.jar를 클래스패스로 이용하고, mypackage/p1/**,mypackage/p2/**패턴을 따르는 소스(.java)를 포함하고, mypackage/p1/testpackage/**는 컴파일 대상에서 제외된다.
<javac srcdir="${src}:${src2}" destdir="${build}" includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**" classpath="xyz.jar" debug=on" />
2개의 source path를 사용하여 compile하도록 한다. 나머지 방법은 위의 방법과 동일하다. 위의 방법은 아래와 같이 재구성되어질수 있다.
<javac destdir="${build}" classpath="xyz.jar" debug=on"> <src path="${src}"/> <src path="${src2}"/> <include name="mypackage/p1/**"/> <include name="mypackage/p2/**"/> <exclude name="mypackage/p1/testpackage/**"/> </javac>
|