이클립스에서 Ant를 이용한 빌드 자동화

Ant

Ant는 자바 기반의 빌드 도구로, 기능은 make 등의 도구와 비슷하다. 그러나 make는 쉘 기반의 도구로 make 파일을 작성할 때 파일 내에서 셀 명령을 많이 사용하게 되는데, 셀 명령은 OS에 종속적이므로 OS가 바뀌게 되면 make 파일 또한 수정해 주어야 한다. Ant는 빌드 파일의 형식이 XML이고 셀 명령을 사용하는 대신 플랫폼 독립적인 자바 클래스를 사용한다. 따라서 OS가 바뀌더라도 빌드 파일을 수정할 필요가 없다.

Ant를 이용하면 CVS 체크아웃에서부터 컴파일, 테스트, 디플로이까지의 빌드 프로세스를 자동화할 수 있다.

 

Ant 빌드 파일은 XML로 작성되며, 하나의 project 요소를 가진다. project 요소는 target 요소를 포함하고, 각 target 요소는 여러 개의 태스크 요소를 포함한다. 간략하게 구졸르 보면 다음과 같다.

<project name="project_name" default="all" basedir=".">
  <target name="all" depends="compile,dist,clean">
    ...
  </target>
  <target name="compile">
    ...
  </target>
  <target name="dist" depends="compile">
    ...
  </target>
  <target name="clean">
    ...
  </target>
</project>

타깃 간의 의존 관계는 target 요소의 depends 속성으로 기술한다. 위의 빌드 스크립트에서 dist 타킷은 compile 타깃에 의존한다.

target 요소는 여러 가지 태스크를 가질 수 있다. 자세한 내용은 Ant 메뉴얼을 참고하기 바란다.
  • property
    이름과 값으로 속성을 지정한다. 속성에서는 대소문자를 구별한다.

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

    빌드 스크립트의 다른 부분에서 이 속성을 참조하려면 “${foo.src}”와 같이 쓰면 된다.

    <javac srcdir="${foo.src}" destdir="${build}"/>

    다음과 같이 파일을 읽어 속성을 설정할 수도 있다.

    <property file="foo.properties"/>
  • mkdir
    새로운 디렉터리를 만들 때 사용되며 다음과 같은 식으로 사용한다.

    <mkdir dir="${dist}"/>
    <mkdir dir="${dist}/lib"/>
  • copy
    디렉터리나 파일을 복사하는 데 사용한다. 파일 하나를 복사할 때는 다음과 같이 한다.

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

    디렉터리를 다른 디렉터리로 복사하는 스크립트는 다음과 같다.

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

    특정 디렉터리의 원하는 파일만 지정(*.java 파일을 제외한 나머지 파일)해 복사한다.

    <copy todir="../dest/dir">
      <fileset dir="src_dir">
        <exclude name="**/*.java"/>
      </fileset>
    </copy>

    위의 내용을 다음과 같이 쓸 수도 있다.

    <copy todir="../dest/dir">
      <fileset dir="src_dir" exclude="**/*.java"/>
    </copy>
  • javac
    Java 소스 파일을 컴파일하는 데 사용한다. 소스 디렉터리는 재귀적으로 탐색되며, class 파일이 없거나 class 파일이 java 파일보다 오래된 경우에만 컴파일을 한다.${src}와 그 하위 디렉터리에 있는 모든 java 파일을 컴파일하여 그 결과를 ${build} 디렉터리에 저장한다. 클래스패스에는 xyz.jar가 포함되고, 디버깅 옵션을 켜고 컴파일한다.

    <javac srcdir="${src}" destdir="${build}" classpath="xyz.jar" debug="on"/>

    ${src}와 ${src2} 및 그 하위 디렉터리에 있는 java 파일을 컴파일하여 그 결과를 ${build} 디렉터리에 저장한다. 컴파일할 때 mypackage/p1과 mypackage/p2에 있는 파일만을 사용하고, 클래스패스에 xyz.jar가 포함된다.

    <javac srcdir="${src}:${src2}" destdir="${build}" include="mypackage/p1/**,mypackage/p2/**"
        exclude="mypackage/p1/testpackage/**" classpath="xyz.jar" debug="on"/>

    위의 예제는 아래와 같이 표현할 수도 있다.

    <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/**"/>
    </java>
  • jar
    지정된 파일들을 jar로 묶는다. ${build}/classes 밑에 있는 파일을 app.jar로 묶는다.

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

    ${build}/clases 밑에 있는 파일을 app.jar로 묶되, mypackage/test 밑에 있는 파일만을 묶고, Test.class는 제외한다.

    <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes" include="mypackage/test/**" exclude="**/Test.class"/>

    ${build}/classes와 ${src}/resources 밑에 있는 파일을 app.jar로 묶되, Test.class는 제외한다.

    <jar destfile="${dist}/lib/app.jar">
      <fileset dir="${build}/classes" exclude="**/Test.class"/>
      <fileset dir="${src}/resources"/>
    </jar>
  • javadoc
    javadoc 문서를 생성한다. 다음 예제는 src 디렉터리 밑에 있는 소스 파일을 읽어 javadoc 문서를 생성하여 ${doc} 디렉터리에 저장한다.

    <javadoc destdir="${doc}">
      <fileset dir="${src}">
      </fileset>
    </javadoc>
  • delete
    하나의 파일 또는 디렉터리와 그 하위 디렉터리, FileSet에 지정된 파일을 삭제한다. /lib/ant.jar 파일을 삭제한다.

    <delete file="/lib/ant.jar"/>

    lib 디렉터리와 그 하위 디렉터리를 삭제한다.

    <delete dir="lib"/>

    현재 디렉터리와 그 하위 디렉터리에서 확장자가 bak인 모든 파일을 삭제한다.

    <delete>
      <fileset dir="." include="**/*.bak"/>
    </delete>

    build 디렉터리와 그 하위 디렉터리를 삭제한다. includeEmptyDirs를 “true”로 설정하면 fileset을 사용할 때 빈 디렉터리도 포함하도록 한다.

    <delete includeEmptyDirs="true">
      <fileset dir="build"/>
    </delete>

빌드 파일 작성

빌드 파일을 추가하려는 프로젝트에 build.xml 파일을 생성한다. 파일 이름이 build.xml일 경우에는 기본적으로 Ant Editor를 사용하도록 지정되어 있는데 사용법이 다른 에디터와 별반 다르지 않다. Outline 뷰에는 빌드 파일의 구조가 표시된다.

Preferences 다이얼로그의 왼쪽 트리에서 Ant>Editor와 그 하위 항목에 Ant 에디터나 코드 어시스트, 빌드 파일 포매팅과 관련된 여러 가지 설정을 조절할 수 있다.

<project name="DummyChatter" default="dist-client" basedir=".">
<target name="init" description="initialize the properties.">
<tstamp/>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="lib" location="lib"/>
<property name="dist" location="dist"/>
<property name="doc" location="doc"/>
</target>

    <!-- ================================= 
          target: compile              
         ================================= -->
    <target name="compile" depends="init" description="--> compile the source files">
        <mkdir dir="${build}"/>
    <javac srcdir="${src}" destdir="${build}" classpath="${lib}"/>
    <copy todir="${build}">
<fileset dir="${build}">
    <include name="**/*.properties"/>
</fileset>
    </copy>
    </target>

    <!-- ================================= 
          target: dist-client              
         ================================= -->
    <target name="dist-client" depends="compile" description="--> chat client packging">
        <mkdir dir="${dist}"/>
    <jar jarfile="${dist}/chat-client${DSTAMP}.jar">
    <fileset dir="${build}">
    <exclude name="chat/server/*.*"/>
    </fileset>
    </jar>
    </target>

    <!-- ================================= 
          target: dist-server              
         ================================= -->
    <target name="dist-server" depends="compile" description="--> chat server packging">
        <mkdir dir="${dist}"/>
    <jar jarfile="${dist}/chat-server${DSTAMP}.jar">
    <fileset dir="${build}">
    <exclude name="chat/client/*.*"/>
    </fileset>
    </jar>
    </target>

    <!-- ================================= 
          target: javadoc              
         ================================= -->
    <target name="javadoc" depends="init" description="--> create java doc">
        <mkdir dir="${doc}"/>
    <javadoc destdir="${doc}">
    <fileset dir="${src}"></fileset>
    </javadoc>
    </target>

    <!-- ================================= 
          target: clean              
         ================================= -->
    <target name="clean" depends="init" description="--> clean up">
        <delete dir="${build}"></delete>
    </target>
</project>

빌드 파일을 저장하면 Outline 뷰에서 아래 그림과 같이 빌드 파일의 구조를 볼 수 있다.
사용자 삽입 이미지

빌드 파일 실행하기

빌드 파일을 실행하는 것은 간단하다. 패키지 탐색기에서 build.xml을 선택한 다음 컨텍스트 메뉴를 띄워 Run As>Ant Build를 선택하면 된다. 별도의 설정이 없는 상태라면 디폴트 타깃(dist-client)이 실행될 것이다. dist-client 타깃은 compile 타깃에 종속적이고, compile 타깃은 init 타깃에 종속적이므로, 결과적으로는 init, compile, dist-client 순서로 실행될 것이다.

Outline 뷰에서도 컨텍스트 메뉴를 통해 빌드 파일을 실행할 수 있는데, 여기서는 특정 타깃을 선택해 실행할 수 있다. Outline 뷰에서 빌드 파일 또는 특정 타깃을 선택한 다음 컨텍스트 메뉴를 띄워 Run As>Ant Build를 선택하면 된다.

 

Ant Build…을 클릭하면 아래와 같은 대화상자가 뜨는데 여기서 여러가지 설정을 바꿀 수 있다.
사용자 삽입 이미지

Ant 실행 설정

위 그림의 Ant 실행 설정 다이얼로그의 윗부분에 Name 항목을 보면 “Dummy Chatter build.xml”로 되어 있는데, 이는 Ant 실행 설정 이름을 나타낸다. 자바 프로그램을 실행할 때와 마찬가지로 빌드 파일을 실행할 때 역시 이클립스는 실행 설정을 저장한다. 빌드 파일을 실행할 때, 실행할 타깃이나 타깃의 순서를 바꾸는 등 하나의 빌드 파일을 여러 형태로 바꿔 실행할 수 있으므로, 각각에 대한 실행 설정을 저장할 필요가 있다.

Outline 뷰에서 다른 타깃을 선택한 다음 컨텍스트 메뉴를 띄워 Run As>Ant Build…를 선택하면, Ant 실행 설정 다이얼로그의 Name 항목이 “?DummyChatter build.xml?dist-server”로 설정되고, Targets 탭의 테이블에 dist-server 타깃이 선택되어 있을 것이다. 그리고 동시에 “?DummyChatter build.xml?dist-server”란 이름의 Ant 실행 설정이 저장된다.

 

하나의 빌드 파일에 대해 실행 설정이 여러 개인 경우 빌드 파일을 실행하면, 이클립스는 아래 그림과 같은 다이얼로그를 띄워 어떤 실행 설정으로 실행할지 사용자에게 묻는다.
사용자 삽입 이미지

이미 저장되어 있는 실행 설정이 리스트로 표시되며, 이중 하나를 선택해 사용할 수 있다.

별도로 설치한 Ant를 사용하는 방법

Ant의 새 버전이 발표되어 이를 사용하고 싶은데 이클립스에는 아직 반영이 안된 경우나 Ant의 최신 기능을 사용해 보기 위해 Nightly Build를 사용하려 할 때는 별도로 설치한 Ant를 이용하도록 이클립스의 설정을 바꿀 수 있다.

별도로 설치한 Ant를 이용하도록 설정을 바꾸는 것은 매우 간단하다. 아래 그림과 같이 Preferences 다이얼로그를 띄운 다음 왼쪽 트리에서 Ant>Runtime을 선택하고 오른쪽 페이지의 Classpath 탭에서 중간에 있는 Ant HOME 버튼을 눌러 별도로 설치한 Ant 디렉터리를 ANT_HOME으로 설정해 주면 된다.
사용자 삽입 이미지

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다