Ant Ant 의 사용 용례와 사용법

황제낙엽 2007.07.16 18:48 조회 수 : 39 추천:72

sitelink1 http://www.javastudy.co.kr/docs/lec_ant/antInstall.txt 
sitelink2  
sitelink3  

 

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:weblogiclibweblogicaux.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>

References
1. http://ant.apache.org
2. http://jakarta.apache-korea.org
3. http://www.javastudy.co.kr