Bitaholic

Ant란? 본문

Computer/프로그래밍일반

Ant란?

Bitaholic 2006. 8. 29. 20:26

 

사용자 삽입 이미지
Ant 란 Java기반의 자동화 빌드 툴이다 make같은 것 과 비슷하지만, 자바 기반으로 쓰여졌고, make는 내부적으로 shell기반 명령어를 쓰는 반면 ant는 xml 파일로 빌드 스크립트를 작성했다. 이말은 O/S 독립적인 툴이라는 것이다.(Shell명령은 O/S종속적이기 때문에)... 근데 왜 Ant라고 지었지?

 

어쨋든. 이 Ant라는 놈을 이번업무때문에 써야해서 ... 간략히 정리좀 해야겠다.

 

 

Ant 빌드 파일은 XML로 작성되며, 최상위 root element로 project를 가지고, project element는 target element를 자식으로 가진다. 또한 target은 task를 자식으로 가진다.

간략한 구조를 보면, 

 

<project>

    <target name="clean">
        <delete dir="build"/>
    </target>

    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="oata.HelloWorld"/>
            </manifest>
        </jar>
    </target>

    <target name="run">
        <java jar="build/jar/HelloWorld.jar" fork="true"/>
    </target>

</project>

 

위 의 bulid파일 예제는 4개의 target으로 이루어져있고, 간략히 설명하면,

1. target 'clean' : 기존의 build 디렉토리와 그 하위 디렉토리를 지우고

2. target 'compile' : build/classes폴더를 만들고, 'src'폴더에 있는 java파일을 컴파일하여

build/classes폴더에 class파일을 저장한다.

3. target 'jar' : build/jar라는 디렉토리를 만들고, build/classes폴더에 있는 class파일들을

build/jar/HelloWorld.jar라는 jar파일로 만든다.

4. target 'run' : 만들어진 build/jar/HelloWorld.jar를 실행한다.

위와 같이 target은 논리적으로 비슷한 task들의 묶음이고, 실제적인 작업내용은 task로 표현한다.

ant에는 수많은 task 가 있다.

수가 많아 분류를 해놓았는데 그것을 보면

Archive Tasks
Audit/Coverage Tasks
Compile Tasks
Deployment Tasks
Documentation Tasks
EJB Tasks
Execution Tasks
File Tasks
Java2 Extensions Tasks
Logging Tasks
Mail Tasks
Miscellaneous Tasks
.NET Tasks
Pre-process Tasks
Property Tasks
Remote Tasks
SCM Tasks
Testing Tasks
Visual Age for Java Tasks

 

세부 task는http://ant.apache.org/manual/index.html여기에 정리가 잘되어있다.

 

자주 쓰는 task를 살펴보면

- property : 속성 지정
- mkdir     : 새로운 디렉터리 생성

- copy      : 파일, 디렉터리 복사

- delete   : 파일, 디렉터리 삭제

- javac     : 컴파일
- jar         : jar 파일 생성

- javadoc : javadoc 생성

 

 

1. property: 이름/값으로 속성을 지정한다. (파일로도 할수 있다. CaseSensitive)

    * url :http://ant.apache.org/manual/CoreTasks/property.html

   

    * example

       1. 이름과 값으로 설정할 때

         <property name="foo.dist" value="dist"/>

      

       2. 파일로 설정할 때

         <property file="foo.properties"/>

          # example of file(foo.properties)

             build.compiler=jikes
             deploy.server=lucky
             deploy.port=8080
             deploy.url=http://${deploy.server}:${deploy.port}/

       3. etc

          : url, properties로 부터 값을 읽어올수도 있따.

   

       #값을 참조

       <echo message="Number of Processors = ${env.NUMBER_OF_PROCESSORS}"/>

         - 여기서 echo 는 console에 문자열을 표시하는 task이다

         - ${ property name } 으로 사용하면 된다.

 

2.  mkdir

    * example

      <mkdir dir="${dist}"/> : creates a directory${dist}.

      <mkdir dir="${dist}/lib"/> : creates a directory${dist}/lib.

 

3.copy(url :http://ant.apache.org/manual/CoreTasks/copy.html)

     - properties

       1. FileSet : 복사할 파일들의 묶음(set)을 선택할 때 사용한다.

     - example

     1. Copy a single file

           <copy file="myfile.txt" tofile="mycopy.txt"/>

       2.  Copy a single file to a directory

           <copy file="myfile.txt" todir="../some/other/dir"/>

       3.  Copy a directory to another directory

           <copy todir="../new/dir">

               <fileset dir="src_dir"/>

           </copy>

       4. Copy a set of files to a directory

          <copy todir="../dest/dir">

             <fileset dir="src_dir">

                <exclude name="**/*.java"/>

             </fileset>

          </copy>

          <copy todir="../dest/dir">

             <fileset dir="src_dir" excludes="**/*.java"/>

          </copy>

4.delete(url :http://ant.apache.org/manual/CoreTasks/delete.html)

    : 하나의 파일 또는 특정 디렉터리, 그 하위 디텔터리 FileSet에 지정된 파일을 삭제한다.

 

    * example

       -  <delete file="/lib/ant.jar"/> <-- 또는 삭제할 디렉터리
            설명 : /lib/ant.jar를 삭제 한다.

 

       -  <delete>

               <fileset dir="." includes="**/*.bak"/>

            </delete>

           설명 : 현재 디렉터리와 그 하위 디렉터리의 bak확장명의 파일을 다 삭제 한다. 

 

       -  <delete includeEmptyDirs="true">

              <fileset dir="build"/>

            </delete>

          설명 : deletes all files and subdirectories ofbuild, includingbuilditself.

 

       -  <delete includeemptydirs="true">

              <fileset dir="build" includes="**/*"/>

           </delete>

          설명 : deletes all files and subdirectories ofbuild, withoutbuilditself.

 

 5.javac:(url :http://ant.apache.org/manual/CoreTasks/javac.html)
        : 자바 소스를 컴파일한다.(재귀적으로 탐색되고, class파일이 없거나, java파일보다 오래된 경우만 컴파일된다)

   *example
    <javac srcdir="${src}" destdir="${build}" classpath="xyz.jar" debug="on" source="1.4" />
            설명 : ${src}와 그하위에있는 모든 java파일을 컴파일하여 ${build}디렉터리에 저장한다. 클래스패스는 xyz.jar가 사용되고,  디버그 옵션은 켜고, 소스레벨은 1.4이다. 

 

    <javac

     srcdir="${src}"
     destdir="${build}"
     includes="mypackage/p1/**,mypackage/p2/**"
     excludes="mypackage/p1/testpackage/**"
     classpath="xyz.jar" 
     debug="on" />
        설명 : 위와 같지만 mypackage/p1과 mypackage/p2에 있는 파일만 사용된다. mypackage/p1/testpackage의 파일은 컴파일에서 제외된다.

 

 

 6.jar: (url :http://ant.apache.org/manual/CoreTasks/jar.html)

  : 지정된 파일을 jar로 묶는다.

 

     *example

        <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>

           설명 : ${build}/classes/에 있는 파일은 ${dist}/lib에 있는 app.jar로 묶는다. 

        

        <jar destfile="${dist}/lib/app.jar"

              basedir="${build}/classes"

              excludes="**/Test.class" />

          설명 : 위와 같지만 Test.class를 뺀다. 

 

        <jar destfile="${dist}/lib/app.jar">

             <fileset dir="${build}/classes" excludes="**/Test.class"/>

            <fileset dir="${src}/resources"/> 

        </jar>

           설명 : ${build}/classes와 ${src}/resources를 jar로 묶되 Test.class는 뺀다.

Comments