본문 바로가기

Dev.../플밍 관련 자료

[펌] Ant란?

Ant의 소개 Ant 는 Java 기반의 Build 툴로써 Unix 의 make 와 같은 툴이라고 보면 된다.

왜 Ant 를 사용해야 하나?
make.gnumake,nmake,jam 과 같은 다른 Build 툴은 놔두고 왜 Ant 를 써야하는가에 대한 질문이다. Java 기반으로 프로그램을 짜고 컴파일 및 배포용 쉘 프로그램을 짜봤는가? 해봤다면 그것의 어려움을 잘 알것이다. 각 OS 마다 쉘 스크립트가 다르고 일반적으로 사용하고 있는 Unix 에는 또 각종 쉘들이 존재한다. 윈도우 쉘 또한 복잡하긴 매한가지이고 프로그램을 모두 작성하고 컴파일 및 배포 쉘 스크립트를 작성하기 위해서 이것들을 모두 작성하는것 자체가 프로그래머에게 또 하나의 고난이 아닐까 생각한다.(즉, 쉘 프로그램을 배워야 한다는 의미이다.)


게다가, 팀 단위 작업을 한다고 할때, 작업하는 컴퓨터와 IDE 들이 각각 다른 경우, IDE 에 따라서 classpath, 배포디렉토리 경로들도 다를 것이다.

Ant 는 OS Indepenent 하게 프로그램을 Build 할 수 있는 환경을 제공해준다. build.xml 이란 Build 파일을 작성해서 그 내용에 따라 Build 를 진행해 나갈 수 있다. Ant 는 Java 에서 거의 표준으로 굳혀져가고 있으며, 거의 모든 IDE들이 Ant 를 지원한다.



Install 현재 Ant 는 Binary 와 Source 두가지를 배포하고 있습니다.


Ant 얻기 - IDE 에 따라서 Ant 가 기본내장되어있는 경우가 많다.

http://jakarta.apache.org/ant/index.html 에서 최신버전의 binary, source 를 얻을 수 있다. CVS 를 이용, source 를 얻을 수도 있다.


시스템 요구사항

Ant 를 사용하여 Build 하기 위해서는 JAXP 호환 XML파서가 있어야 합니다. 그런데 Ant 를 다운받으면 그 패키지 안에 포함되어 있으므로 따로 다운받으실 필요는 없습니다. JAXP 에 대해서는 http://java.sun.com/xml/ 정보를 얻을 수 있습니다.
Build 툴이기 때문에 당연히 JDK 가 필요합니다. JDK 1.2 이상을 가지고 있으면 됩니다.
Ant 의 몇몇 특정 Task 들의 경우 (JUnit, FTP, Telnet 등) 해당 라이브러리가 필요하다. 이는 http://jakarta.apache.org/ant/manual/install.html#librarydependencies 항목을 읽기 바란다.


Install

바이너리 파일을 기준으로 설명하겠습니다. 설치는 Windows 기반으로 설명하겠습니다. Unix/Linux 기반을 비슷하니 알아서(?) 하세요. ^^;


일단 받은 Ant 압축파일을 C:\Ant 에 풀어 놓고 시작해봅시다. 하위 디렉토리는 bin,doc,lib 등이 있겠죠. ^^ (Win 9x 시리즈에서는 환경변수에 들어가는 긴 파일명이 문제가 될 수 있으니 위와 같이 C:\Ant 에 설치하는 것이 좋습니다.)

PATH 환경변수에 Ant 아래에 bin 디렉토리를 추가합니다. 즉 C:\Ant\bin 을 추가합니다.

ANT_HOME 이라는 환경 변수를 만들고 그안에 Ant 가 설치된 디렉토리 값을 넣습니다. 즉 C:\Ant 를 넣습니다.

JAVA_HOME이라는 환경변수에는 JDK가 설치된 디렉토리를 추가합니다.

Windows Shell


set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.3.1_01
set PATH=%PATH%;%ANT_HOME%\bin


Unix(Linux) (bash)

export ANT_HOME=/usr/local/ant
export JAVA_HOME=/usr/local/jdk-1.3.1_01
export PATH=${PATH}:${ANT_HOME}/bin


Optional Tasks

Ant 는 다양한 Optional Tasks를 제공합니다. 일단 Task 라는 말이 앞으로 많이 나올텐데 Glossary 를 참고하세요. 예를들면 CVS 에 소스를 업데이트 해주는 Optional Task 가 있을 수 있고, 또 .NET 컴파일을 한다던지.. 기타 등등 다양한 Task 가 있습니다. (이에 대한 예제로는 AntTask를 참조)



Running 이제 Ant 를 실행하는 방법에 대해서 알아보자. Ant를 실행하는 것은 마치 make 명령을 내리는 것처럼 쉽다. Ant 에서 중요한 것은 make에서 "Makefile" 을 만들듯이 Build 파일을 잘 만드는 것이 중요합니다. Build 파일을 만드는 것에 대해서는 나중에 알아보기로 하고 일단 실행하는 방법부터 알아보죠.

일단 쉘에서 실행하는 간단한 형태는 다음과 같습니다.(여기서 '%'는 쉘을 의미합니다.)


% ant

이것은 현재 디렉토리에 build.xml 이라는 파일을 Build File 로 해서 Build 를 하겠다는 것입니다. build.xml 파일이 없다면 에러를 출력하겠죠? ^^

% ant -buildfile test.xml

이것은 build 파일을 test.xml 이라는 파일을 build 파일로 사용해서 build 하겠다는 의미입니다.

% ant -buildfile test.xml dist


이것은 바로 위에 있는 것에다가 dist라는 것이 붙었는데 이것은 target 을 나타냅니다. Unix/Linux 에서 make 명령으로 컴파일 해보신 분들을 아실껍니다. 보통 make 명령으로 컴파일 하고 make install 명령으로 인스톨을 하죠? 거기서 쓰인 install 이 target 입니다. Ant 에서는 Build 파일 안에 다양한 target 을 둘 수 있습니다. 예를 들면 debug 모드 컴파일과 optimal 모드 컴파일 2개의 target 을 만들어서 테스트 할 수 있겠죠? ^^

% ant -buildfile test.xml -Dbuild=build/classes dist

위의 예에 하나가 추가됐죠? -D 옵션은 Build 파일의 Property task 와 같은 역할을 합니다. 즉 Build File 내부에서 사용되는 일종의 변수를 선언한다고 볼 수 있겠죠? ^^


직접 실행하기
실행 파일 ant는 Unix 계열에서는 shell 스크립트로 Windows 계열에서는 ant.bat 라는 배치파일로 배포됩니다. 내부에 보면 java 프로그램을 실행하는데, 다음과 같이 자신이 직접할 수도 있습니다.

% java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target]


Buildfile(build.xml) 을 만들어보자 Ant 를 다룰줄 안다는 말은 즉, Build File 을 만들줄 안다는 의미와 같다. Build File 은 파일이름에서도 알 수 있듯이 xml 을 기반으로 하고 있다. 예제로 참조해볼만한 화일로 Ant/TaskOne, Ant/BuildTemplateExample 이 있다. 해당 화일을 보면서 설명을 읽으면 편할것이다.


--------------------------------------------------------------------------------

project 태그

일단 제일 처음 나오는 Root Element 로는 project 태그로 프로젝트 정의를 하는 곳이다.

Attribute Description Required
name 프로젝트의 이름 No
default default target 명을 넣는 곳이다. ant 를 실행할 때 target 을 지정하지 않으면 여기서 지정한 target 으로 실행한다. Yes
basedir 프로젝트의 base 디렉토리를 말한다. ant 내부에서 사용되는 모든 path 들은 이 디렉토리를 기반으로 한다. No


추가적으로 project 태그 뒤에 description 이란 태그를 사용하여 Project 를 설명할 수 있다.


--------------------------------------------------------------------------------

target 태그

project 태그 다음에 올수 있는 태그로 아래 나오는 Task 들의 묶음이라고 생각하면 된다.
기존의 Makefile 이라던지 다른 Build 툴을 보면 의존관계(Dependency)라는 것이 있을 것이다. 즉, 배포(distribute)라는 target 을 수행하기 전에 compile 이라는 target 을 먼저 수행해야 하는 의존 관계가 발생할 수 있을 것이다. target 에서는 이런 의존관계(dependency)를 다음과 같은 방법으로 제공한다.


<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>


위의 예를 보면 B 는 A 를 의존하고 있고, C 는 B를 D는 C를 의존하고 있다. 처음 시작하는 tag 라 D라고 했을 때, D 는 C에 의존하므로 C 를 실행하러 간다. C 를 보면 B 를 의존하므로 B 를 수행하고 B 는 A를 의존하므로 A 가 수행된다. 즉 이것의 수행 순서는 A,B,C,D 순으로 수행된다.
그리고 D 가 C 에 의존해서 A,B,C 를 수행하고 난 후에 다시 B 에 의존하게 된는데 B는 한번 수행했으므로 다시 실행되지 않는다. 이점을 유의하도록 하자. target 은 한번만 수행된다.

의존관계외에 target을 수행하기 위해서 조건을 걸어서 사용할 수 있다. 이는 "'if'"와 "'unless'" 라는 attribute 를 사용해서 할 수 있다. 형식은 다음과 같다.



<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>