2008년 10월 05일
Ant를 이용한 빌드 자동화

자바로 프로젝트를 진행하다 보면 프로젝트를 jar로 묶거나 또는 문서화를 하는 등의 작업을 해야 할 경우가 있습니다. 그런데 이러한 작업을 하려면 이클립스에서 설정을 해주거나 또는 콘솔에서 명령을 넣어줘야 하죠? 이는 한 번만 한다면 상관이 없겠지만 여러번 같은 작업을 수행할 경우 여간 성가신 작업이 아닐 수 없습니다. 게다가 개발자라면 단순 반복하는 작업의 경우 자동화를 시켜 놓는것은 누구나 생각하는 것이겠습니다.

그럼 이러한 작업들을 자동화 해 줄 수 있는 Ant에 대해서 알아볼까요 ~~ 이번 포스팅은 iNSight 출판사의 "Java 세상을 덮치는 Eclipse"의 내용을 참고하여 정리해 보았습니다.

Ant란?

Ant는 Java 기반의 빌드 도구로, 기능은 make 같은 도구와 비슷합니다. 그러나 make는 셸(shell) 기반의 도구로 make파일을 작성할 때 파일 내에서 셸 명령을 많이 사용하게 되는데, 셸 명령은 OS에 종속적이므로 OS가 바뀌게 되면 make 파일 또한 수정해 주어야 합니다. Ant는 빌드파일의 형식이 XML이고, 셸 명을 사용하는 대신 플랫폼 독립적인 Java 클래스를 사용합니다. Ant를 이용하면 CVS 체크아웃에서부터 컴파일, 디플로이까지의 빌드 프로세스를 자동화 할 수 있습니다. Eclipse는 Ant 플러그인을 기본으로 내장하고 있으며, Ant를 좀 더 편리하게 사용할 수 있는 사용자 인터페이스를 제공하고 있습니다.

빌드파일 작성

빌드파일을 작성하기 위한 예제 프로젝트를 만들어 보았습니다. 에코 서버인데 xSocket이라는 라이브러리를 이용하여 만들어 보았고 프로젝트 구조는 다음과 같습니다. 이를 이용하여 에코 서버를 배포하기 위한 jar파일과 javadoc 문서도 같이 만들어 보겠습니다.

원래 lib 폴더에 xSocket-2.1.1.jar가 나타나야 하는데 아무리 Refresh를 해도 안되네요 ;; 아래는 프로젝트 구조와 폴더 구조입니다.


Ant 빌드파일은 XML로 작성되며, 하나의 project 요소를 가집니다. project 요소는 target 요소를 포함하고, 각 target 요소는 여러 개의 태스크 요소를 포함합니다. 간략한 구조는 아래와 같습니다.


타깃 간의 의존 관계는 target 요소의 depends 속성으로 기술합니다. 위의 빌드 스크립트에서 dist 타깃은 compile 타깃에 의존합니다. 결국 all 타깃은 의존 관계에 의해 compile -> dist -> clean 순으로 동작이 완료 된 후에 실행 되게 됩니다.

target요소는 여러 가지 태스크를 가질 수 있는데, 여기서는 예제에서 사용할 몇 가지만 살펴보도록 하겠습니다. 나머지는 Ant 메뉴얼을 참고하세요 ~
  • property : 속성을 지정

  • mkdir : 새로운 디렉토리 생성

  • copy : 파일, 디렉토리 복사

  • javac : 컴파일

  • jar : jar 파일 생성

  • javadoc : javadoc 생성

  • delete : 파일, 디렉토리 삭제

property

이름과 값으로 속성을 지정합니다. 속성에서는 대소문자를 구별합니다.

다음은 foo.src라는 이름의 속성으로 "src"를 지정합니다.

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

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

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

다음과 같이 파일을 읽어 속성을 설정할 수도 있습니다. 이건 어떻게 하는 건지 확인을 못해 봤네요 ㅡㅜ

<javac 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 파일을 제외한 나머지 파일을 복사합니다.)
여기서 exclude는 특정 내용을 제외하는 키워드이고 **의 경우 src_dir 디렉토리 및에 모든 디렉토리를 재귀적으로 탐색하는 것을 의미합니다.

<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 파일이 javㅁ 파일보다 오래된 경우에만 컴파일합니다.

${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가 포합됩니다.
여기서 include가 특정 내용을 포함하는 키워드 입니다.

<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/**" />
    <include name="mypackage/p1/testpackage/** />
</javac>



jar

지정된 파일들을 jar로 묶습니다.

${build}/classes 밑에 있는 파일을 app.jar로 묶습니다.

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

${build}/classes 밑에 있는 파일을 app.jar로 묶되, mypackage/text 밑에 있는 파일만을 묶고 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>


지금까지 설명한 내용을 바탕으로 에코 서버를 컴파일하여 jar파일로 묶고, javadoc을 생성하는 것까지 자동화하는 Ant 빌드파일을 작성해보았습니다. 먼저 AntTest 프로젝트에 build.xml 파일을 생성합니다. 파일 이름이 build.xml일 경우 자동으로 Ant 에디터를 사용하도록 지정되어 있습니다. Outline뷰에 빌드파일의 구조가 표시됩니다.

빌드를 하기 위해서는 단축키 Shift + Alt + X -> Q를 누르시거나, 아래 그림을 따라 하시면 됩니다.

방법 1.


방법 2.


그럼 결과는 ~


예제 프로젝트 다운로드 : study.zip

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by greenfrog | 2008/10/05 15:32 | Eclipse | 트랙백 | 덧글(2)
트랙백 주소 : http://greenfrog7.egloos.com/tb/914069
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 바람나무 at 2008/10/09 21:24
안녕하세요, 댓글 달아주셔서 왔습니다. 배울 점이 많은 블로그네요. 열심히 들ㄹㄹ여다보고 많이 배워 가겠습니다.
Commented by greenfrog at 2008/10/10 23:13
제 블로그를 좋게 봐주셨다니 감사합니다. 앞으로 자주 뵈어요 ~ ^^

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>