Platform 독립적인 Java 의 프로그램 컴파일, 배포 도구 이다. 비슷한 역할로 Unix의 make 툴과 Windows에서 프로그램 Installer 를 생각할수 있다.
----
[[TableOfContents]]
=== 들어가기 전에.. ===
일단 이글은 Jarakta 프로젝트의 일부인 Ant 에 대한 메뉴얼(?)같은 것으로써http://jakarta.apache.org/ant/manual/
의 해석 및 의견 정도로 진행되었으면 좋겠습니다.
contributor : 임구근
=== 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 두가지를 배포하고 있습니다.
1. Ant 얻기 - IDE 에 따라서 Ant 가 기본내장되어있는 경우가 많다.
* http://jakarta.apache.org/ant/index.html 에서 최신버전의 binary, source 를 얻을 수 있다. CVS 를 이용, source 를 얻을 수도 있다.
2. 시스템 요구사항
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 항목을 읽기 바란다.
3. 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 [[BR]]
set JAVA_HOME=c:\jdk1.3.1_01 [[BR]]
set PATH=%PATH%;%ANT_HOME%\bin [[BR]]
}}}
===== 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 파일을 만드는 것에 대해서는 나중에 알아보기로 하고 일단 실행하는 방법부터 알아보죠.
일단 쉘에서 실행하는 간단한 형태는 다음과 같습니다.(여기서 '%'는 쉘을 의미합니다.)
{{{~cpp
% ant
}}}
이것은 현재 디렉토리에 build.xml 이라는 파일을 Build File 로 해서 Build 를 하겠다는 것입니다. build.xml 파일이 없다면 에러를 출력하겠죠? ^^
{{{~cpp
% ant -buildfile test.xml
}}}
이것은 build 파일을 test.xml 이라는 파일을 build 파일로 사용해서 build 하겠다는 의미입니다.
{{{~cpp
% ant -buildfile test.xml dist
}}}
이것은 바로 위에 있는 것에다가 dist라는 것이 붙었는데 이것은 target 을 나타냅니다. Unix/Linux 에서 make 명령으로 컴파일 해보신 분들을 아실껍니다. 보통 make 명령으로 컴파일 하고 make install 명령으로 인스톨을 하죠? 거기서 쓰인 install 이 target 입니다. Ant 에서는 Build 파일 안에 다양한 target 을 둘 수 있습니다. 예를 들면 debug 모드 컴파일과 optimal 모드 컴파일 2개의 target 을 만들어서 테스트 할 수 있겠죠? ^^
{{{~cpp
% ant -buildfile test.xml -Dbuild=build/classes dist
}}}
위의 예에 하나가 추가됐죠? -D 옵션은 Build 파일의 Property task 와 같은 역할을 합니다. 즉 Build File 내부에서 사용되는 일종의 변수를 선언한다고 볼 수 있겠죠? ^^
''' 직접 실행하기 '''
실행 파일 ant는 Unix 계열에서는 shell 스크립트로 Windows 계열에서는 ant.bat 라는 배치파일로 배포됩니다. 내부에 보면 java 프로그램을 실행하는데, 다음과 같이 자신이 직접할 수도 있습니다.
{{{~cpp
% 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)를 다음과 같은 방법으로 제공한다.
[[BR]]
[[BR]]
[[BR]]
[[BR]]
위의 예를 보면 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 를 사용해서 할 수 있다. 형식은 다음과 같다.
[[BR]]
[[BR]]
----
* Task 관련 태그들
----
* ''property'' 태그 - 일종의 변수역할을 한다. 예제들을 보면 property 태그로 정의한 변수들이 어떻게 이용되는지 알 수 있다.
----
* Path-like 구조
----
* ''arg'' 태그
----
=== Glossary ===
* '''Build File''' : Build 의 순서 및 각 단계별 작업들에 대해서 xml 형식으로 적어놓은 파일을 말한다. Ant 에서는 default 로 build.xml 을 사용한다.
* '''Task''' : Ant 에서의 작업단위(빌드, CVS, FTP, JUnit 실행 등등)를 말하는 것입니다. 예를 들어 설명하면 property task 는 Ant에서 쓰는 변수(쉘에서의 환경변수와 비슷한)의 값을 설정합니다. ["Ant/TaskOne"]
* '''Target''' : '''Task'''들의 집합으로 서로간의 의존관계와 주어진 조건에 따라 수행된다.
----
=== 관련글들 ===
* [http://javastudy.co.kr/docs/lec_oop/ant/ant1.htm Ant 자바스터디강좌]
* ["Ant/BuildTemplateExample"]
* ["Ant/JUnitAndFtp"]
* ["Eclipse"], ["IntelliJ"]
* [http://jstorm.pe.kr/BBS/files/colJApp/ant_jinho.pdf] - JStorm ant document
* [http://developer.java.sun.com/developer/Quizzes/misc/ant.html Test your knowledge of Ant]
AntHill, CruiseControl 등의 툴과 연동하여 이용하기도 한다. 이 툴들은 해당 ant build 를 스케줄러에 맞춰놓고, 해당 시간이 되면 자동으로 해당 ant build file을 실행해준다. See Also Wiki:AntHill, Wiki:CruiseControl
----
["도구분류"]