반응형

1. Ant란?

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


2. Ant 기본

Ant 빌드 파일은 XML로 작성되며, 하나의 Project 요소(element)를 가진다. 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 타깃에 의존한다.


2-1. property => 속성지정

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

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

다른 부분에서 이 속성을 참조하려면 "${foo.src}"와 같이 쓰면된다.

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

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

<property file="foo.properties"/>


2-2. mkdir => 새로운 디렉터리 생성

<mkdir dir="${dist}"/>


2-3. copy => 파일, 디렉터리 복사

파일 하나를 복사할때 : <copy file="myfile.txt" toFile="mycopy"/>

디렉터리를 다른 디렉터리로 복사할때

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

<fileset dir="src_dir"/>

</copy>

특정 디렉터리의 원하는 파일(java 파일을 제외한)만 복사

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

<fileset dir="src_dir">

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

</fileset>

</cotpy>

위 코드를 다르게 코딩

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

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

</copy>


2-4. javac => 컴파일하기

<javac srcdir="${src}:${src2}"                                       <!-- ${src}와 그 하위 디렉토리에 있는 모든 java 파일을 컴파일하여 -->

destdir="${build}"                                                   <!-- 그 결과를 ${build} 디렉토리에 저장한다. -->

include="mypackage/p1/**,mypackage/p2/**"          <!-- 컴파일 할 때 mypackage/p1과 mypackage/p2에 있는 파일만을 사용하고 -->

exclude="mypackage/p1/testpackage/**"                 <!-- mypackage/p1/testpackage는 제외한다. -->

classpath="xyz.jar"                                                <!-- 클래스패스에 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/**"/>

</javac>


2-5. jar => jar  파일 생성

${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>


2-6. javadoc => javadoc 문서 생성

src 디렉토리 밑에 있는 소스 파일을 읽어 javadoc 문서를 생성하여 ${doc} 디렉터리에 저장한다.

<javadoc destdir="${doc}">

<fileset dir="${src}">

</fileset>

</javadoc>


2-7. delete => 파일, 디렉터리 삭제

파일 하나 삭제 : <delete file="/lib/ant.jar"/>

lib 디렉터리와 그 하위 디렉터리 삭제 : <delete dir="lib" />

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

<delete>

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

</delete>

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

<delete includeEmptyDirs="true">

<fileset dir="build" />

</delete>


3. 빌드 파일 작성

프로그램을 컴파일하고, 클라이언트 모듈과 서버 모듈을 각각 jar 파일로 묶고, javadoc을 생성하는 것까지 자동화하는 Ant빌드 파일을 작성해 보도록 한다.

3-1. build.xml 파일을 생성한다.

파일이름이 build.xml일 경우에는 기본적으로 Ant Editor를 사용하도록 지정되어 있는데 사용법이 다른 에디터와 별반 다르지 않으며, 에디터에 입력한 내용에 따라 Outline 뷰에 빌드 파일의 구조가 표시된다. Ant Editor는 빌드 파일을 실시간으로 검사한다.

<project name="DummyChatter" default="dist-client" basedir=".">

</project>

3-2. 초기화 작업을 하는 타깃을 작성한다. 초기화 작업에서는 타임스탬프를 생성해두고 속성을 정의한다.

<!-- init -->

<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>

3-3. 컴파일을 위한 태스크를 작성한다. Compile 타깃이 실행되기 위해서는 init타깃에서 설정한 여러 속성을 참조해야 한다. 

       따라서 compile 타깃은 init 타깃에 의존하며 depends 속성에 init 타깃을 지정해야 한다. 

 컴파일을 하기전에 먼저 ${build} 디렉터리를 만들고, 그 다음 ${src} 디렉터리에 있는 소스 파일을 컴파일해 결과를 ${build} 디렉터리에 저장한다.

 컴파일 할때 클래스 패스로 ${lib}/log4j-1.2.5.jar가 사용된다. 컴파일이 끝나고, 확장자가 properties인 파일을 ${build} 디렉토리로 복사한다.

 <target name-"compile" depends="init" description="compile the source files">

<mkdir dir="${build}" />

<javac srcdir="${src}" destdir="${build}" classpath="${lib}/log4j-1.2.5.jar" />

<copy todir="${build}">

<fileset dir="${src}">

<include name="**/*.properties" />

</fileset>

</copy>

</target>


3-4. 클라이언트 프로그램을 jar로 묶기

디폴트 타깃인 dist-client다. 이 타겟을 입력하면 스크립에 있던 에러가 사라진다.

<target name="dist-client" depnds="compile" description="chat client packing"> 

<mkdir dir="${dist}" />                                         <!-- ${dist}디렉터리를 만들고 ${build}와 그 하위 디렉터리에 있는 파일을 jar로 묶는다.  -->

<jar jarfile="${dist}/chat-client${DSTAMP}.jar" />   <!-- jar 파일은 ${dist} 디렉토리에 생기고 파일이름은 날짜가 붙는다. -->

<fileset dir=${build}>

<exclude name="chat/server/*.*" />          <!-- chat/server에 있는 파일은 클라이언트에서 필요가 없음으로 제외시킨다. -->

</fileset>

</jar>

</target>


3-5. 서버 프로그램을 jar로 묶기

3-4 와 비교해서 굵은 글씨만 변경된다.

<target name="dist-client" depnds="compile" description="chat client packing"> 

<mkdir dir="${dist}" />                                         <!-- ${dist}디렉터리를 만들고 ${build}와 그 하위 디렉터리에 있는 파일을 jar로 묶는다.  -->

<jar jarfile="${dist}/chat-server${DSTAMP}.jar" />   <!-- jar 파일은 ${dist} 디렉토리에 생기고 파일이름은 날짜가 붙는다. -->

<fileset dir=${build}>

<exclude name="chat/client/*.*" />          <!-- chat/server에 있는 파일은 클라이언트에서 필요가 없음으로 제외시킨다. -->

</fileset>

</jar>

</target>


3-6 javadoc 생성

${doc} 디렉터리를 만들고, javadoc을 생성하여 ${doc} 디렉터리에 저장한다. javadoc을 만들 대상에서 *.properties 파일은 제외한다.

<target name="javadoc" depends="init" description="create java doc">

<mkdir dir="${doc}" />

<javadoc destdir="${doc}">

<fileset dir="${src}">

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

</fileset>

</javadoc>

</target>


3-7 정리작업

임시로 만들었던 디렉터리(${build}를 제거한다.

<target name="clean" depends="init" description="clean up">

<delete dir="${duild}" />

</target>


3-8 3번에서 작성했던 코드를 합치자

지금까지 작성한 build.xml을 첨부하겠다.

build.xml


4. 빌드 파일 실행시키기

- Run As> Ant Build를 선택하면 빌드 파일이 실행된다.

- 코드내용에 보면, dist-client 타깃은 compile 타깃에 종속적이고, compile 타깃은 init타깃에 종속적이므로, 결과적으로 init -> compile -> dist-client 순서로 실행.

"Run As> Ant Build..." 이건 다이얼로그가 뜨고, 타깃 앞에 있는 체크박스를 이용해 실행시킬 타깃을 선택할 수 있다.


5. Ant 실행 설정

- Run As> External Tools Configurations... 항목을 선택하면 다이얼로그가 뜨고, Ant 실행 설정을 할 수 있다. 이 다이얼로그를 이용해 Ant나 다른 외부 도구(external tools)의 실행 설정을 관리 할 수 있다.


6. Ant 뷰

- Eclipse에서는 Ant 작업 지원을 위한 별도의 뷰도 제공한다.

- 메뉴바에서 Window> Show View> Ant를 선택하면 현재의 퍼스펙티브에 Ant 뷰가 나타난다.


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

- Preferences 다이얼로그를 띄운 다음 Ant> Runtime 페이지의 Classpath 탭에서 중간에 있는 Ant HOME 버튼을 눌러 별도로 설치한 Ant 디렉터리를 

  ANT_HOME으로 설정해주면 된다.


반응형

'Java > Java' 카테고리의 다른 글

리팩터링  (0) 2014.05.09
JUnit을 이용한 단위테스트  (0) 2014.05.08
Java  (0) 2014.03.27
참조변수와 인스턴스  (0) 2013.12.20
디자인패턴  (0) 2013.12.12

+ Recent posts