/-----------------------------------------------------------------------------------------
출처: http://www.javastudy.co.kr/docs/lec_oop/ant/ant1.htm 
        http://www.javastudy.co.kr/docs/lec_oop/ant/ant2.htm
------------------------------------------------------------------------------------------/

ANT (상): Ant 무엇에 쓰는 물건인고?

저자: 김영익

자바 빌드 도구인 Ant와 이를 이용한 실전예제를 다루는 기사이다. Ant는 실제로 어떤 프로그램을 개발하느냐에 상관없이 사용되는 빌드 도구로 얼마나 개발을 편리하게 해주느냐가 관건이지 프로그램이나 프로젝트와는 특별한 관계가 없다. 본 기사는 모든 자바 개발자를 대상으로하여 작성되었다. 초급자에게는 앞으로 진행할 프고젝트나 프로그램을 편하게 개발할 수 있게 해주며, 중급 이상자에게는 더욱 더 게을러질 수 있는(?) 기회를 제공해 줄 것이다.

1. Ant 개요

다음은 Ant를 소개하는 자카르타 사이트의 원문 중에서 처음 부분이다.
Apache Ant is a Java based build tool. In theory it is kind of like make without make's wrinkles. Why another build tool when there is already make, gnumake, nmake, jam, and others? Because all of those tools have limitations that Ant's original author couldn't live with when developing software across multiple platforms. . . . 이후 생략(http://jakarta.apache.org/ant/index.html 참고).
Ant가 탄생하게 된 배경을 원문과 필자의 경험으로 간추려 보면 다음과 같다.
C나 C++를 사용하는 개발자들은 대부분 make나 nmake 또는 기타 다른 빌드 도구를 사용해왔다. 그렇다면 자바 개발자들은 어떤 빌드 도구를 사용할 것인가? 물론 make를 사용할 수 있다. 실제로 필자도 본인과 절친한 개발자가 만든 make 파일을 사용한 적이 있었다. 하지만 근본적으로 자바 언어를 위한 것이 아니기 때문에 불편하고 심지어는 필요한 기능이 없을 수도 있다. 하지만 이제는 걱정할 필요가 없다. 우리에겐 Ant가 있기 때문이다. Ant는 make를 비롯한 기존의 빌드 도구를 사용하면서 겪게 되는 많은 어려움을 줄여주면서 더 많은 기능을 제공한다. 물론 처음 배우는 개발자들에겐 약간의 시간을 투자해야 하는 부담이 가겠지만 일단 배우고 나면 그 효과는 투자한 시간에 비해 몇 배 이상이 될 것이다.
Ant와 같은 빌드 도구를 사용하지 않을 경우 도스 창에서 클래스 패스에 클래스를 추가하거나 소스 파일 컴파일, jar 파일로 묶는 작업, 묶은 jar 파일을 특정 디렉토리로 이동시키고 수정된 내용을 javadoc으로 문서화 시키는 등의 작업은 소스가 수정될 때마다 한 단계씩 도스 창에서 모두 입력해야 한다. 하지만 Ant를 사용하면 마치 배치(bat) 파일을 실행한 것처럼 이와 같은 일련의 작업들을 Ant를 이용하여 단 한번에 수행할 수 있다. 정말 편리하지 않겠는가?

Ant의 주요 기능을 알기 쉽게 몇 가지만 나열해 보면 아래와 같다.
  • 자바 소스 파일 컴파일(너무 당연하다)
  • jar, war, ear, zip 파일의 생성
  • javadoc을 실행하여 도움말 생성
  • 파일이나 폴더의 이동 및 복사, 삭제
  • 각각의 작업에 대한 의존성 설정
  • 유닉스에서처럼 파일이나 폴더에 퍼미션 설정
  • 파일의 변경 날짜를 설정하는 touch 기능
  • 외부 프로그램의 실행
이외에도 너무 많아서 나열할 수 가 없을 정도로 많은 기능들이 있다. 하지만 뭐니 뭐니 해도 가장 유용한 기능은 빌드할 때마다 수많은 키보드를 두드려야 하는 단순 노동을 하지 않아도 된다는 것이고 플랫폼에 무관한 XML을 이용한다는 것이다. XML을 사용하는 것이 무슨 장점이 될 수 있냐고 하실 분들도 있을지 모르겠다. 하지만 예전에 make 파일을 사용하면서 특정 부분에서 항상 앞에 탭(tab)키를 입력해야만 하는 것을 몰라서 개발자들이 고생하는 것을 본 적이 있다. Ant의 등장은 이와 같은 모호함을 없애자는 것이다. 또한 XML은 이미 IT 업계의 상당 부분에서 표준으로 자리를 잡아 가고 있는 현실이다. 냉혹한 현실에 뒤쳐지는 개발자는 살아 남을 수 없다.

2. 어디에서 Ant를 구할 수 있나?

Ant는 Jakarta 사이트에 가면 다운 받을 수 있다. 어서 가서 받아 두자.
http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/

이 글을 쓰는 시점에서는 버전 1.4.1이 가장 최신의 버전이지만 Ant도 버전에 따라 API의 변화가 있다. 버전이 다르면 빌드할 때 'deprecated …'와 같은 메시지가 뜨거나 에러가 발생할 수 있으므로 가능한 한 같은 버전을 다운 받아서 사용하길 권장하는 바이다.

3. Ant 설치

설치에는 그다지 복잡한 사항이 없다. 일단 사이트에서 다운로드 받은 압축 파일(jakarta-ant-1.4.1-bin.zip)을 적당한 위치에 풀어놓기만 하면 된다. 그리고 몇 가지 환경 설정을 추가로 해줄 필요가 있다.

설치한 폴더가 c:\dev\tools\jakarta-ant-1.4.1 일 경우 [그림 1]처럼 디렉토리와 파일들이 생성된다.

/bin : Ant 실행을 위한 배치 파일이 있다(유닉스나 리눅스의 경우 셸 파일 사용)
/lib : jar 파일들
/docs : 매뉴얼과 API 문서가 있다.


[그림 1] 설치 후 디렉토리 및 파일

윈도우 환경에서는 환경 설정을 다음과 같이 해주면 된다.
set ANT_HOME=c:\dev\tools\jakarta-ant-1.4.1
set JAVA_HOME=c:\jdk1.3.1
set PATH=%PATH%;%ANT_HOME%\bin
유닉스나 기타 다른 운영체제에서의 설정은 Ant 매뉴얼(http://jakarta.apache.org/ant/manual/install.html)을 참고하기 바란다.

4. Hello Ant !

이제 설치가 끝났으니 실전 예제로 들어가 보도록 하자. 개발자들에게는 이미 익숙한 Hello 예제부터 시작할 것이다.

4.1 준비하기

먼저 적절한 폴더 설정과 소스 파일이 당연히 필요하다. 그림과 같이 c:\\ant_test 폴더를 만들고 하위 폴더로 classes, doc, jar, src 폴더를 생성한다. 그리고 src 폴더 밑에는 HelloAnt.java 파일을 하나 생성한다.


[그림 2] HelloAnt.java 파일을 만든다

HelloAnt.java의 내용은 어떤 것이라도 상관 없으니 여러분께서 알아서 하시길...

4.2 Build.xml

Ant를 실행하면 초기값으로 현재 폴더에 있는 build.xml 파일을 찾아서 빌드하게 된다. 여기에서는 build.xml 파일의 위치를 "C:\ant_test" 밑에 두었다.


[그림 3] build.xml 생성

이제부터는 build.xml 파일을 살펴볼 것이다. 혹시 XML에 익숙치 않다고 하더라도 겁먹지 말고 차근차근 살펴보도록 하자. 만약 아래의 XML 파일을 사용할 때는 반드시 주석문을 제거하고 사용해야 한다. 그렇지 않으면 Ant를 실행할 때 에러가 발생한다.
<?xml version="1.0"?>

<!--
name : 프로젝트 이름
default : 초기치로 설정되는 작업, 아무 것도 지정하지 않고 실행하면 이 작업을 수행
basedir : 프로젝트에 대한 기준 폴더를 지정
property : 프로젝트에서 사용할 각 폴더들의 위치를 지정
${basedir} : 이미 앞에서 설정된 값을 읽어온다
-->

<project name="HelloAnt" default="javadoc" basedir="." >
<property name="src.dir" value="${basedir}/src" />
<property name="classes.dir" value="${basedir}/classes" />
<property name="jar.dir" value="${basedir}/jar" />
<property name="javadoc.dir" value="${basedir}/doc" />


<!--
target : 각각의 타겟을 지정, 타겟이란 프로젝트를 이루는 하나 하나의 작업 단위
srcdir : 컴파일 하기 위한 자바 소스 파일의 위치를 지정
destdir : 어느 폴더에 클래스 파일들을 위치 시킬지 지정
-->

<target name="compile" >
<javac srcdir="${src.dir}" destdir="${classes.dir}" />
</target>

<!--
jar : 파일을 만든다
depends : compile 정상적으로 수행되어야만 진행
jarfile : jar 파일의 위치와 파일 이름 지정
basedir : jar로 묶을 클래스 파일의 위치
includes : 모든 폴더에서 클래스 파일들만 포함
-->

<target name="jar" depends="compile">
<jar jarfile="${jar.dir}/hello.jar"
basedir="${classes.dir}"
includes="**/*.class"
/>
</target>

<!--
javadoc을 실행
depends : compile과 jar 수행이 정상적으로 끝나야만 실행
sourcepath : 소스 폴더 지정
sourcefiles : 소스 파일 지정
windowtitle : 제목 지정
destdir : 파일 생성후 저장할 폴더 지정
-->

<target name="javadoc" depends="compile, jar" >
<javadoc
sourcepath="${src.dir}"
sourcefiles="${src.dir}/HelloAnt.java"
windowtitle="HelloAnt API"
destdir="${javadoc.dir}"
/>
</target>

<!--
소스 코드를 제외한 모든 작업 파일들과 폴더를 삭제한다
-->

<target name="clean" >
<delete dir="${classes.dir}/classes/*"/>
<delete dir="${jar.dir}/jar/*"/>
<delete dir="${javadoc.dir}/doc/*"/>
</target>

</project>
이런 파일을 한번만 만들어 두면 다른 프로젝트를 할 때도 조금씩 수정해서 계속 써먹을 수 있다. 재사용(reuse)이란 그래서 좋은 것이다.

4.3 Ant 실행

그럼 어떻게 실행하면 될까? 먼저 실행할 때 필요한 옵션으로는 어떤 것들이 있는지 알아보자. 도스 창 프롬프트에서 'ant ?help' 라고 입력한다
C:\ant_test>ant -help
ant [options] [target [target2 [target3] ...]]
Options :
-help 도움말을 보여준다.
-projecthelp 프로젝트에 필요한 도움을 보여준다
-version 현재 ant 버전을 보여준다
-quiet build하는 과정을 디스플레이 하지 않는다.
-verbose verbose모드를 실시한다.
-debug debugging 정보를 보여준다.
-emacs 로깅 정보를 만들어낸다
-logfile file 주어진 파일로 로그를 출력한다.
-logger classname 클래스를 이용하여 로깅을 수행한다.
-listener classname 리스너클래스를 추가한다.
-buildfile file 대상 build파일을 정의한다.
-D<property>=<value> build설정에 필요한 프로퍼티를 사용한다.
-find file 루트로부터 buildfile을 찾아서 실행한다.
앞에서 만든 빌드 파일을 실행한 결과는 다음과 같다. 실행은 build.xml 파일이 있는 폴더에서 도스 창을 열고 'ant'라고만 입력하면 된다.
C:\ant_test>ant
Buildfile: build.xml

compile:

jar:

javadoc:
[javadoc] Generating Javadoc
[javadoc] Javadoc execution
[javadoc] Loading source file C:\ant_test\src\HelloAnt.java...
[javadoc] Constructing Javadoc information...
[javadoc] Building tree for all the packages and classes...
[javadoc] Building index for all the packages and classes...
[javadoc] Building index for all classes...

BUILD SUCCESSFUL

Total time: 3 seconds
C:\ant_test>
폴더를 살펴보면 각 폴더에 클래스 파일들, jar 파일, HTML 문서가 생성된 것을 확인할 수 있다. 만일 Ant를 실행할 때 에러가 발생했다면 왜 에러가 발생하는 것인가? 앞에서 필자는 주석문을 제거하고 사용하기를 권고했다. 주석문을 제거하지 않고 사용할 경우 다음과 같은 에러 메시지를 출력하면서 Ant는 실패 결과를 알려준다.
C:\ant_test>ant
Buildfile: build.xml

BUILD FAILED

C:\ant_test\build.xml:1: Character conversion error: "Malformed UTF-8 char -- is
an XML encoding declaration missing?" (line number may be too low).

Total time: 0 seconds
C:\ant_test>
위와 같이 에러가 발생했을 경우 메시지를 보면서 하나씩 해결해 나가도록 하자. 그리고 그 해결은 여러분 스스로 해보길 바란다.
------------------------------------------------------------------------------------------

ANT (하): Ant 무엇에 쓰는 물건인고?

저자: 김영익

본 기사는 자바 빌드 도구인 Ant와 이를 이용한 실전예제를 다루는 기사이다. Ant는 실제로 어떤 프로그램을 개발하느냐에 상관없이 사용되는 빌드 도구로 얼마나 개발을 편리하게 해주느냐가 관건이지 프로그램이나 프로젝트와는 특별한 관계가 없다. 본 기사는 모든 자바 개발자를 대상으로하여 작성되었다. 초급자에게는 앞으로 진행할 프로젝트나 프로그램을 편하게 개발할 수 있게 해주며, 중급 이상자에게는 더욱 더 게을러질 수 있는(?) 기회를 제공해 줄 것이다. 본 기사의 상편을 보지 못한 독자나 Ant의 기본 개념을 모르는 독자들은 「ANT 상편: Ant 무엇에 쓰는 물건인고?」를 먼저 읽어보기 바란다.

1. copy 예제

다음과 같은 경우를 가정해보자.
나는 지금 웹 프로그램을 개발 중이다. 웹 컨테이너로는 톰캣을 사용하고 있으며 MVC 모델을 사용하기 때문에 JSP와 서블릿, 일반 자바 클래스를 만들고 있다. 그런데 일반 자바 클래스와 서블릿은 컴파일해서 클래스 파일들만 톰캣 폴더에 위치 시키면 된다고 알고 있다. 소스는 물론 다른 폴더에 있기 때문에 컴파일할 때마다 클래스 파일들을 톰캣 폴더에 복사하는 것이 여간 귀찮은 작업이 아니다. 어떻게 하면 한번에 이 문제를 해결할 수 있을까?
앞에서 사용한 빌드 파일을 살짝 변경하면 문제를 간단히 해결할 수 있다. Ant에서 지원하는 'copy' 기능을 사용하여 클래스 파일들을 다른 폴더로 간단하게 복사만 하면된다. 그리고 빌드 파일 사이에 다음 부분을 추가한다. 역시 주석문은 제외하고 사용하길…

<property name="tomcat.dir" value="D:/Tomcat 4.0/webapps/ROOT/WEB-INF" />


<!--
클래스 파일들을 톰캣 폴더에 복사
-->
<target name="tomcat" depends="compile" >
<copy todir="${tomcat.dir}/classes" >
<fileset dir="${classes.dir}" >
</fileset>
</copy>
</target>
톰캣 폴더에도 클래스 파일들이 복사된 것을 확인할 수 있다.

2. Hello EJB 예제

이번에는 EJB를 위한 build.xml 예제를 살펴보도록 하자. 우리는 웹로직 6.1 버전을 위한 빌드 파일을 다루지만, 다른 EJB 컨테이너들도 Ant를 이용하는 제품들이 있으므로 하나만 잘 익혀두면 다른 컨테이너에서도 조금만 수정해서 쉽게 사용할 수 있다. 이 build.xml은 EJB 소스를 컴파일 한 후, jar로 필요한 파일들을 묶고, ejbc를 수행한 후 디플로이하기 위해 EJB서버의 특정 디렉토리로 보내는 일련의 작업을 수행한다.
<project name="HelloEJB" default="all" basedir=".">
<!-- Build에 힐요한 전역 변수를 설정한다. -->
<!-- 필요 없는 부분은 삭제한다. -->
<property environment="env"/>
<property file="../../../../examples.properties"/>
<property name="source" value="."/>
<property name="build" value="${source}/build"/>
<property name="dist" value="${source}/dist"/>

<!-- all이라는 타겟을 수행하기 위해서는 clean, init등이 실행 성공 해야 한다. -->
<target name="all" depends="clean, init, compile_ejb, jar_ejb, ejbc"/>

<!-- build를 하기 위해 폴더 생성 및 필요한 파일을 복사한다. -->
<target name="init">
<mkdir dir="${build}"/>
<mkdir dir="${build}/META-INF"/>
<mkdir dir="${dist}"/>
<copy todir="${build}/META-INF">
<fileset dir="${source}">
<include name="*.xml"/>
<exclude name="build.xml"/>
</fileset>
</copy>
</target>

<!-- javac를 수행하여 클래스 화일을 생성한다. 컴파일에 필요한 대상 EJB의 홈 및
리모트 인터페이스, 빈 클래스 등을 클래스 패스에 추가한다. -->
<target name="compile_ejb">
<javac srcdir="${source}" destdir="${build}" includes="*.java"
classpath="${WL_HOME}/lib/weblogic_sp.jar;${WL_HOME}/lib/weblogic.jar;
${source}/helloClient.jar;"/>
</target>

<!-- 디플로이먼트 디스크립터 XML파일과 클래스 파일들을 jar로 묶는다.
ejb-client.jar를 Class-path로 설정한 manifest 파일을 설정 할 수 있다.-->
<target name="jar_ejb" depends="compile_ejb">
<jar jarfile="${dist}/std_ejb20_basic_tester.jar" basedir="${build}"
manifest="ejb_MANIFEST.MF">
</jar>
</target>

<!-- 디플로이 가능한 jar화일을 만들기 위해 ejbc를 수행한다. -->
<target name="ejbc" depends="jar_ejb">
<java classname="weblogic.ejbc" fork="yes">
<sysproperty key="weblogic.home" value="${WL_HOME}"/>
<arg line="-compiler javac ${dist}/std_ejb20_basic_tester.jar
${APPLICATIONS}/ejb20_basic_tester.jar"/>
<classpath>
<pathelement path="${WL_HOME}/lib/weblogic_sp.jar;
${WL_HOME}/lib/weblogic.jar"/>
</classpath>
</java>
</target>
<!-Build 후 필요없는 디렉토리를 삭제한다. -->
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
3. JBuilder에서 AntRunner 사용하기

Ant 문서에 보면 다른 여러 개발 도구들(예를 들어 JBuilder, Visual Age for Java 등)에서 Ant와 어떻게 연동하는지에 대해서도 나와 있다. 이번에는 JBuilder에서 Ant를 이용하여 프로젝트를 쉽게 빌드 하는 법을 살펴보자.

3.1 AntRunner 설치

우선 JBuilder에서 Ant를 사용하기 위해서는 AntRunner라는 프로그램을 구해야 한다. 프로그램에 소요되는 비용은 걱정할 필요가 없다. 이것도 역시 오픈 소스이기 때문에 무료로 제공된다. AntRunner는 다음 링크에서 다운로드 받을 수 있다.

http://sourceforge.net/projects/antrunner/

우리는 AntRunner 1.3 버전을 사용할 것이고, 테스트 해 본 결과로는 JBuilder 5 또는 6에서 잘 작동 했다. 참고로 JBuilder 4에서도 잘 동작한다고 사이트에는 나와 있다. antrunner_v1.3-tool.zip 파일을 다운 받은 후 압축을 풀어서 생긴 파일을 모두 JBuilder설치 폴더 밑의 \lib\ext 폴더 안에 넣어 두고 antrunner.config을 에디터로 열어서 다음과 같이 편집한다.

# AntRunner configuration
# Ant를 설치한 폴더의 위치에 맞게 설정하면 된다
addjars C:\dev\tools\jakarta-ant-1.4.1\lib
그리고 이제 JBuilder를 실행한다. 실행하면 툴바에 아래 그림과 같은 개미 머리 버튼이 보일 것이다. 왼쪽의 버튼이 Ant 실행 버튼이고, 오른쪽 버튼은 build.xml 파일이 변경되었을 경우 다시 불러오는 버튼이다.

메뉴에서 Tools→IDE Options를 선택하면,

다이얼로그 창이 뜨는데 Ant 배치 파일 위치를 지정한다.

다시 메뉴에서 Project→Configure Ant를 선택하고,

다이얼로그에서 buil.xml 파일의 위치를 지정한다.

이제 설정은 모두 끝났다. 이제부터는 실제로 빌드를 해보도록 하자.

3.2 AntRunner를 이용한 빌드

그럼 이제 JBuilder 의 고유한 빌드 기능이 아닌 AntRunner의 빌드 기능을 사용해 보도록 한다. 빌드는 앞에 그림에서 나온 것처럼 빌드 버튼을 누르면 default로 설정된 타겟이 실행 된다. 다른 타켓을 실행하고 싶으면 아래 그림에서처럼 빌드 버튼 옆의 리스트 버튼을 누르면 타겟 리스트가 나오고, 그때 원하는 타겟을 선택해서 실행할 수 있다. 볼드체로 진하게 나온 것이 기본으로 실행이 되는 default 타겟이다.

빌드 생성 결과는 어떻게 알 수 있는가? 그 결과는 맨 아래에 있는 메시지 창에 나온다. 소스코드에 javadoc을 위한 주석을 모두 달았더니 HTML API 문서도 생성되었다.

4. 마무리

지금까지 이 기사에 나온대로 열심히 따라한 독자들에게 감사말씀을 올린다. Ant는 본 기사에 소개한 기능 외에도 다른 기능들이 많이 있으니 열심히 공부해서 다른 사람들과도 공유해보도록 하자. 이제 Ant를 배웠으니 귀찮은 빌드 작업은 개미에게 맡기고 코드나 작성하면서 노는 베짱이가 되는 것은 어떻겠는가……

5. 참고 자료

+ Recent posts