Ant에 대해서

  1. Ant에 대해서
    1. Ant
    2. Ant 설치
    3. 프로젝트 구조 선택
    4. 빌드
    5. Target 정의
    6. Task 정리
    7. Ant, Maven 의존성 관리
    8. 참고문헌
    9. 문서에 대하여

Ant

자바 소스 파일을 컴파일 하고 JavaDoc을 생성하고 JAR 파일들을 묶고, JUnit 테스트를 실행하는 등
많은 일을 할 수 있는 태스크(Task)를 제공한다.

Ant 장점

  • Compile, deploy, publishing 이 쉽다.
    • 변경된 파일만 컴파일한다.
  • open source
  • 환경변수 독립적
    • classpath
  • 거의 모든 IDE 를 지원한다.
    • eclipse, jbuilder, netbeans 등

Ant 설치

Ant download

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;

프로젝트 구조 선택

빌드

  • 앤트 빌드 파일은 이식 가능한다. 플랫폼 의존성에 관련된 문제점을 해결해 준다.(자바 클래스 경로 형식 등)
  • 파일간 의존성 정보를 계속 추적한다.

    즉 소스파일이 변경되었을 때만 javac 컴파일러를 호출한다. 모든 파일이 다시 컴파일되기를 기다릴 필요가 없다.
  • 자바 소스 컴파일 외에도 많은 일을 할 수 있는 Task가 들어 있다.(JUnit 테스트를 실행하는 task 등)

    뒤에 따라 정리한다.

앤트 빌드 작성하기

앤트가 실행되면 기본적으로 현재 작업 디렉토리에서 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>

스테이지(local, alpha, beta, real)별 빌드


<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>

Target 정의

init

빌드 시 가장 먼저 실행된다.

  • property를 설정
  • 각종 변수 초기값 설정

prepare

빌드 시 두번째로 실행된다. 'init'에 의존

  • 필요한 디렉토리 생성
  • 물론, init에서 이 작업을 했다면 prepare를 굳이 쓸 필요없다.

clean

  • 이전 실행으로 생긴 출력들을 삭제한다.(예, build 디렉토리 삭제 등)
  • 보통 init 전에 호출한다.

compile

  • java 소스 파일을 컴파일한다.

jar

  • 빌드한 재료를 가지고 jar 파일을 생성한다.

Task 정리

주로 쓰이는 Task에 대해서만 간단하게 정리한다.

압축 태스트

  • bunzip2 : GZip이나 BZip2로 압축된 파일을 푼다.
  • gunzip : GZip으로 압축된 파일을 푼다.

<bunzip2 src="test.tar.gz" dest="test2.tar"/>
<bunzip2 src="test.tar.gz" dest="test2.tar"/>

프로퍼티설명필수여부
src압축 파일필수
dest압축을 풀어서 저장할 디렉토리나 파일선택
  • Unjar : jar로 압축된 파일을 푼다.
  • Untar : tar로 압축된 파일을 푼다.
  • Unwar : war로 압축된 파일을 푼다.
  • Unzip : zip로 압축된 파일을 푼다.

<unzip src="tools-src.zip" dest="${tools.home}"/>

<gunzip src="tools.tar.gz"/>
<untar src="tools.tar" dest="${tools.home}"/>

프로퍼티설명필수여부
src압축 파일fileset을 쓰지 않을 경우 필수
dest압축을 풀어서 저장할 디렉토리나 파일필수
  • bzip2 : GZip이나 BZip을 이용해서 파일을 압축한다.
  • gzip : GZip을 이용해서 파일을 압축한다.

<bzip2 src="test.tar" zipfile="test.tar.bz2"/>
<gzip src="test.tar" zipfile="test.tar.gz"/>

프로퍼티설명필수여부
src압축하고자 하는 파일들필수
zipfile생성하고자 하는 압축파일필수
  • ear : jar 태스크의 확장판으로 Enterprise ARchive가 되는 파일을 다룬다.
  • jar : jar 형식으로 파일을 압축한다.
  • tar : tar 형식으로 파일을 압축한다.
  • war : jar 태스크의 확장판으로 WEB-INF/lib, WEB-INF/classes, WEB-INF 디렉토리인 Web ARchive가 되는 파일을 다룬다.
  • zip : zip 형식으로 파일을 압축한다.

<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

<copy file="myfile.txt" tofile="mycopy.txt"/>

프로퍼티설명필수여부
file복사하고자 하는 파일. 최소한 하나 이상 필요필수(<fileset> 요소로 대체 가능)
todir복사한 파일을 담을 디렉토리필수
tofile복사한 파일을 담을 디렉토리필수
  • delete: 특정 디렉토리의 모든 하위 디렉토리에 있는 파일을 지우거나, fileset으로 지정된 특정한 파일을 지운다.

<delete file="/lib/a.jar"/>

프로퍼티설명필수여부
file지우고자 하는 파일필수(<fileset> 요소로 대체 가능)
dir지우고자 하는 디렉토리(하위 디렉토리 포함)필수(<fileset> 요소로 대체 가능)
  • mkdir : 디렉토리를 생성한다. 필요하다면 없는 상위 디렉토리도 만든다.

<mkdir dir="${dist}"/>

  • move : 파일을 새로운 파일이나 디렉토리로 옮긴다.

<move file="file.old" tofile="file.new"/>

프로퍼티설명필수여부
file옮기고자 하는 파일필수(<fileset> 요소로 대체 가능)
todir옮긴 파일을 담을 디렉토리필수
tofile옮긴 파일을 담을 디렉토리필수

메일 태스크

  • mail : SMTP 이메일을 전송

<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첨부파일
userSMTP 인증용 사용자 이름
passwordSMTP 인증용 사용자 암호
subject제목선택

원격 태스크

  • ftp

<ftp server="ftp.apache.org"
    userid="anonymous"
    password="me@mydomain.com"
    <fileset dir="htdocs/manual"/>

Ant, Maven 의존성 관리

프로젝트에 새로운 type이나 task를 추가할 수 있다.
org.apache.tools.ant.Task를 상속하여 사용자 정의 Task를 만든다.
이렇게 만든 task를 ant build 내에서 사용할 때 typedef 를 쓴다.
여기서는 maven 에서 제공하는 ant tasks를 이용하여 ant에서 dependency 관리, repository 등록하는 방법을 알아본다.

ant에서 maven 사용

우선 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>

참고문헌

문서에 대하여