자바 소스 파일을 컴파일 하고 JavaDoc을 생성하고 JAR 파일들을 묶고, JUnit 테스트를 실행하는 등
많은 일을 할 수 있는 태스크(Task)를 제공한다.
http://ant.apache.org 에서 다운 받아서 압축만 풀면 된다.(D:\ant)
2008년 9월 3일 기준 최신 Release는 1.7.1 버전이다.
대부분 개발자의 OS 환경이 Windows이므로 이 기준으로 작성한다.
시스템 변수로 다음을 설정한다.
ANT_HOME = D:\ant
JAVA_HOME = D:\Java\jdk1.5.0_16
Path = %PATH%;%ANT_HOME%\bin;%JAVA_HOME%\bin;

앤트가 실행되면 기본적으로 현재 작업 디렉토리에서 build.xml 을 찾는다.
build.xml
<?xml version="1.0"?>
<project name="dms" default="compile" basedir=".">
<property name="build.dir" location="build"/>
<property name="build.prod.dir" location="${build.dir}/prod"/>
<property name="build.test.dir" location="${build.dir}/test"/>
<property name="doc.dir" location="doc"/>
<property name="index.dir" location="index"/>
<property name="src.dir" location="src"/>
<property name="test.dir" location="test"/>
<property name="vendor.lib.dir" location="vendor/lib"/>
<path id="project.classpath">
<pathelement location="${build.prod.dir}" />
<pathelement location="${build.test.dir}" />
<fileset dir="${vendor.lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="prepare">
<mkdir dir="${build.prod.dir}"/>
<mkdir dir="${build.test.dir}"/>
</target>
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}" destdir="${build.prod.dir}">
<classpath refid="project.classpath" />
</javac>
</target>
<target name="compile-tests" depends="compile">
<javac srcdir="${test.dir}" destdir="${build.test.dir}">
<classpath refid="project.classpath" />
</javac>
</target>
<target name="test" depends="compile-tests">
<junit haltonfailure="true">
<classpath refid="project.classpath" />
<formatter type="brief" usefile="false" />
<batchtest>
<fileset dir="${build.test.dir}"
includes="**/*Test.class" />
</batchtest>
<sysproperty key="doc.dir" value="${doc.dir}" />
<sysproperty key="index.dir" value="${index.dir}" />
</junit>
</target>
<target name="clean">
<delete dir="${build.dir}" />
</target>
</project>
<target name="init">
<echo message="initializing project..." />
<mkdir dir="${src.conf.dir}" />
<mkdir dir="${build.classes.dir}" />
<mkdir dir="${web.lib.dir}" />
<!-- 테스트/리얼 중 실행 환경 세팅 -->
<condition property="settings.runEnv" value="test">
<equals arg1="${deploy.phase}" arg2="local" />
</condition>
<condition property="settings.runEnv" value="test">
<equals arg1="${deploy.phase}" arg2="alpha" />
</condition>
<condition property="settings.runEnv" value="real">
<equals arg1="${deploy.phase}" arg2="beta" />
</condition>
<condition property="settings.runEnv" value="real">
<equals arg1="${deploy.phase}" arg2="release" />
</condition>
<echo message="settings.runEnv = ${settings.runEnv}" />
</target>
빌드 시 가장 먼저 실행된다.
빌드 시 두번째로 실행된다. 'init'에 의존
주로 쓰이는 Task에 대해서만 간단하게 정리한다.
<bunzip2 src="test.tar.gz" dest="test2.tar"/>
<bunzip2 src="test.tar.gz" dest="test2.tar"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| src | 압축 파일 | 필수 |
| dest | 압축을 풀어서 저장할 디렉토리나 파일 | 선택 |
<unzip src="tools-src.zip" dest="${tools.home}"/>
<gunzip src="tools.tar.gz"/>
<untar src="tools.tar" dest="${tools.home}"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| src | 압축 파일 | fileset을 쓰지 않을 경우 필수 |
| dest | 압축을 풀어서 저장할 디렉토리나 파일 | 필수 |
<bzip2 src="test.tar" zipfile="test.tar.bz2"/>
<gzip src="test.tar" zipfile="test.tar.gz"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| src | 압축하고자 하는 파일들 | 필수 |
| zipfile | 생성하고자 하는 압축파일 | 필수 |
<ear destfile="${build.dir}/myapp.ear" appxml="${src.dir}/metadata/application.xml"/>
<fileset dir="${build.dir}" includes="*.jar,*.war"/>
</ear>
<jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
<tar tarfile="${dist}/manual.tar" basedir="htdocs/manual"/>
<gzip zipfile="${dist}/manual.tar.gz" src="${dist}/manual.tar"/>
<zip destfile="${dist}/manual.zip" basedir="htdocs/manual"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| destfile | 만들고자 하는 압축파일 | 필수 |
| basedir | 압축을 시작할 디렉토리 이름 | 선택 |
| appxml | (META-INF/application.xml)를 사용할 디플로이 설명자 | (despcriptor) update값이 true가 아닐 경우 필수 |
<copy file="myfile.txt" tofile="mycopy.txt"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| file | 복사하고자 하는 파일. 최소한 하나 이상 필요 | 필수(<fileset> 요소로 대체 가능) |
| todir | 복사한 파일을 담을 디렉토리 | 필수 |
| tofile | 복사한 파일을 담을 디렉토리 | 필수 |
<delete file="/lib/a.jar"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| file | 지우고자 하는 파일 | 필수(<fileset> 요소로 대체 가능) |
| dir | 지우고자 하는 디렉토리(하위 디렉토리 포함) | 필수(<fileset> 요소로 대체 가능) |
<mkdir dir="${dist}"/>
<move file="file.old" tofile="file.new"/>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| file | 옮기고자 하는 파일 | 필수(<fileset> 요소로 대체 가능) |
| todir | 옮긴 파일을 담을 디렉토리 | 필수 |
| tofile | 옮긴 파일을 담을 디렉토리 | 필수 |
<mail mailhost="smtp.mydomain.com" mailport="1025" subject="result building">
<from address="sender@mydomain.com"/>
<replyto address="me@mydomain.com"/>
<to address="all@mydomain.com"/>
<message>${buildname} build has failed</message>
</mail>
| 프로퍼티 | 설명 | 필수여부 |
|---|---|---|
| from | 보내는 사람의 이메일 주소 | 필수(<from> 요소로 대체 가능) |
| tolist | 받을 사람 | |
| cclist | 참조인 | |
| bcclist | 숨은 참조인 | |
| message | 이메일 내용 | |
| messagefile | 이메일의 내용이 담긴 파일 | |
| files | 첨부파일 | |
| user | SMTP 인증용 사용자 이름 | |
| password | SMTP 인증용 사용자 암호 | |
| subject | 제목 | 선택 |
<ftp server="ftp.apache.org"
userid="anonymous"
password="me@mydomain.com"
<fileset dir="htdocs/manual"/>
프로젝트에 새로운 type이나 task를 추가할 수 있다.
org.apache.tools.ant.Task를 상속하여 사용자 정의 Task를 만든다.
이렇게 만든 task를 ant build 내에서 사용할 때 typedef 를 쓴다.
여기서는 maven 에서 제공하는 ant tasks를 이용하여 ant에서 dependency 관리, repository 등록하는 방법을 알아본다.
우선 http://maven.apache.org/download.html에서 최신 버전의 maven-artifact-ant-*..-dep.jar를 다운로드 한다.
(현재 최신 버전은 Maven Ant Tasks 2.0.9 이나 실제 개발에서 사용했던 maven-artifact-ant-2.0.4-dep.jar를 사용한다)
프로젝트의 lib 디렉토리에 복사한다.(상위 프로젝트 구조 참조)
ant의 build.xml을 아래 코드를 추가한다.
maven을 이용한 dependency관리와 repository 등록을 위한 기본 설정이 완료됐다.
# load the maven task
# typedef를 설정하면 ant에서 maven 관련 tag를 쓸 수 있다
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant">
<classpath>
<pathelement location="lib/maven-artifact-ant-2.0.4-dep.jar" />
</classpath>
</typedef>
<artifact:pom file="pom.xml" id="maven.project" />
<artifact:dependencies pathId="compile.classpath" filesetId="compile.fileset" useScope="compile">
<pom refid="maven.project" />
</artifact:dependencies>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>1.0.0</modelVersion>
<groupId>com.oracleclub</groupId>
<artifactId>wiki</artifactId>
<name>My Oracle</name>
<version>3.0</version>
<dependencies>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>oracleclub</id>
<name>oracleclub Repository</name>
<url>dav:http://repo.www.gurubee.net/maven2</url>
</repository>
</distributionManagement>
</project>