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 ---- ["도구분류"]