Ant 소개

IDE & Build/Ant 2012. 11. 6. 14:32


출처 - www.infopub.co.kr/info/ebook/pdf/8054-514.pdf

Ant 소개.pdf






Ant 는 JAVA 기반 빌드 툴로서 C나 C++ 에서 사용되는 make, nmake와 유사한 유틸리티입니다.

좀 더 JAVA에 적합하게 만들어져 있고 자동화에 유리합니다.

주요 기느으로는 자바 소스 컴파일, 파일이나 폴더의 이동 및 복사, 삭제, jar, war, ear, zip 파일의 생성, DB 스크립트 실행, 외부 프로그램 실행 등 언급한 것 외에도 여러가지 작업을 수행할 수 있습니다.

 

Ant 를 다운로드 받을 수 있는 URL 은 http://ant.apache.org/bindownload.cgi 이다. 하지만 Eclipse의 경우에는 이미 Ant가 포함되어 있으므로 따로 설치할 필요는 없습니다.

 

속성(attribute)

설명(Description)

필수(Required)

name

Project의 이름.

아니오.

default

Ant를 수행할 때 Targer을 지정하지 않을 경우 default로 수행할 Target

네.

basedir

Ant가 수행 될 기본 디렉토리

아니오.

Project의 정의에 따라 build.xml 파일의 유효한 xml 의 첫 라인을 살펴보면 다음과 같습니다.

 

<project name = "Crown" default = "build">

 

build란 target을 default 로 지정한 Crown 이라는 프로젝트입니다. target이란 수행할 작업의 set을 위미하는데, 모든 project는 하나 이상의 target을 가집니다.

 

타겟(Targets)

타겟은 다음과 같은 속성을 가지고 있습니다:

속성(attribute)

설명(Description)

필수(Required)

name

타겟의 이름.

depends

이 타겟이 의존하는, 타겟의 이름의 콤마로 단락지어진 리스트

아니오

if

이 타겟을 실행하기 위해 설정되어야만 하는 프로퍼티의 이름.

아니오

unless

이 타겟을 실행하기 위해서 설정되어선 안 되는 프로퍼티의 이름.

아니오

description

이 타겟의 기능에 대한 간단한 설명.

아니오

타겟(target)은, 다른 여러 타겟에 의존할 수 있습니다.

그러나, 주의해야 할 것은, Ant의 depends 속성은 어느 타겟이 실행되어야 할 것인가의 순서를 지정하기 때문에 의존하고 있는 다른 타겟이 실행되는데에는 큰 영향을 주지 않습니다. (참고 주소 : http://flashcafe.org/java_study/6901/page/6)

 

Ant는 depends 속성의 타겟을, 보이는 순서(왼쪽에서 오른쪽으로) 실행하려고 합니다. 먼저 출현하는 타겟을 의존하고 있는 경우에는, 그것을 먼저 실행됩니다.

<target name="A"/>

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

예를 들어서 위의 예제처럼 타겟 D를 실행하고 싶다고 가정해 봅시다. 이 depends 속성(의존 속성)으로부터, 최초로 타겟 C를, 다음에 B를, 그리고 A를 실행해야 한다고 생각한다면 잘못된 생각입니다.

C는 B에 의존해, B는 A에 의존하고 있으므로, 최초로 A, 다음에 B, 다음에 C, 그리고 마지막에 D가 실행됩니다.

타겟은 어느 프로퍼티가 설정되어 있는 (또는 되어 있지 않은) 경우에, 그것을 실행하거나 실행하지 못하게 막을 수도 있습니다.

 

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

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

 

만약 module-A-present 프로퍼티가 설정되어 있다면, 타겟이 실행됩니다. 두번째의 예에서는, 만약 module-A-present 프로퍼티가 설정되어 있는 경우에는, 타겟은 실행되지 않습니다. (자세한 것은 위의 속성을 참조하세요.)

만약 if 와 unless 속성이 존재하지 않는다면, 타겟은 항상 실행될 겁니다.

추가적인 description 속성은 타겟에 붙는 간단한 설명을 제공하기 위해 사용할 수가 있습니다.

프로퍼티(Property)

속성(attribute)

설명(Description)

필수(Required)

name

프로퍼티의 이름.

value

프로퍼티의 value

name attribute가 사용될 경우 이 중 한 가지

location

주어진 파일의 파일이름으로 프로퍼티 설정

refid

다른 곳에 정의된 Object를 refid로 참조

resource

프로퍼티 파일의 리소스 명

name attribute가 사용되지 않을 경우 이 중 한가지

 

file

프로퍼티 파일의 파일이름

url

프로퍼티 파일을 읽는 url

environment

환경변수에 붙는 prefix

classpath

리소스를 찾을 때 사용될 클래스패스

아니요

classpathref

다른 곳에 Path로 정의된 classpath의 reference

아니요

prefix

로드 된 파일이나 리소스에 붙는 prefix

아니요

 

프로젝트는 프로퍼티의 집합을 가질 수가 있습니다. 이것들은 property 태스크에 의해 빌드파일 중에서 설정될 수도 있고, Ant 의 밖에서 설정될 수도 있습니다. 프로퍼티는, 이름(name)과 값(value)을 가지고 있습니다. 이름은 대·소문자를 구별합니다. 

프로퍼티는 태스크의 속성의 값으로 해서 사용할 수가 있습니다. 이것은 속성의 값 중에서 "${" 와 "}" 의 사이에 프로퍼티명을 쓰는 것으로 사용가능합니다. 예를 들면, 값 "build" 를 가지는 "builddir" 라고 하는 프로퍼티가 있다면, 속성 내에서 "${builddir}/classes" 와 같이 사용할 수가 있습니다. 이것은, 실행시에, "build/classes" 로서 처리됩니다.

 



실 전

참조 주소 : http://decoder.tistory.com/8

 앞에서 설명했지만 Ant는 아파치 프로젝트의 하위 프로젝트로서 자바 기반의 빌드 도구로, Ant를 사용하였을 때의 장점은 다음과 같습니다.

- Ant 빌드 파일은 이식 가능함 : 플랫폼 독립적

- Ant는 파일 간 의존성 정보를 계속 추적함 

- Ant에는 자바 소스 파일을 컴파일 하는 기능 이외에도 갖가지 일을 할 수 있는 태스크(task)가 많이 들어있음. 


Ant 빌드 파일을 작성하기 위해 위에서 설명한 대로 Ant를 다운로드하여 적당한 곳에 압축을 풉니다.

환경변수의 classpath와 path에 각각 %ANT_HOME%\lib와 %ANT_HOME%\bin을 추가해 준다. 이클립스와 같은 IDE를 사용하면 Ant가 이미 내장되어 있습니다. Ant를 이용하여 빌드 파일은 보통 build.xml 로 줍니다. 인터넷으로 build.xml 이라고 검색하면 괜찮은 예제들을 많이 볼 수 있습니다. 하지만, 집적 프로젝트를 뛰면, 그 프로젝트에 맡는 build.xml을 사용해야겠지요.


1. 프로젝트 정의

가장 먼저 할 일은 프로젝트를 정의하는 것입니다.

<?xml version="1.0"?>

<project name="Crown" default="compile" basedir="."> 

Ant 빌드 파일은 하나의 프로젝트를 정의합니다.

<project>요소의 이름은 Crown 으로 지정하였고, default 속성 값은 compile로 하였는데, 이는 명령행에서 매개변수 없이 ant를 입력했을 때, 기본적으로 컴파일을 수행함을 뜻합니다(나중에 타겟으로 compile을 만들어 줍니다). basedir은 . 으로 했는데, 이는 이 빌드 파일에서 사용되는 다른 모든 경로는 build.xml 파일이 들어있는 디렉터리를 기준으로 한 상대경로라는 것을 의미합니다.


2. 각종 property 정의

다음으로는 디렉터리 구조를 정의하는 프로퍼티(property)를 정의하여 Ant에 프로젝트 디렉터리 구조를 알려줍니다.

       <property name="build.dir" location="build"/>

       <property name="build.prod.dir" location="${build.dir}/prod"/>

       <property name="src.dir" location="src"/>

       <property name="lib.dir" location="lib"/>

이렇게 작성한 것의 의미를 살펴보면 <property> 요소의 location 속성값(baesdir 속성값을 기준으로 한 상대 경로)과 name 속성값을 연결한 것인데, ${build.dir}의 경우 프로퍼티의 이름을 변수처럼 사용하여 다른 디렉터리를 참조하여 사용할 수 있습니다. 이건 많이 해보면서 숙달되어가면 익숙해집니다. 그냥 별명을 준다고 생각하시면 될 듯 싶네요.


3. 자바 클래스 경로 정의

       <path id="project.classpath">

             <pathelement location="${build.prod.dir}" />

             <fileset dir="${lib.dir}">

                    <include name="*.jar" />

             </fileset>

       </path>

path 요소는 project.classpath라는 경로를 생성한다. 이 경로는 나중에 컴파일시에 사용됩니다. pathelement 요소에서는 빌드 디렉터리를 클래스 경로에 추가해서 자바 컴파일러가 모든 클래스 파일을 찾을 수 있게 합니다. 그리고 fileset 요소에서는 .jar 파일들을 클래스 경로에 추가하여 우리가 작성한 클래스 파일에서 사용되는 라이브러리 또한 쉽게 찾을 수 있도록 합니다. 위에서 설명한 것처럼 대부분 여기에서도 ${}를 이용하여 디렉터리 경로에 참조를 이용합니다. 이렇게 하면 빌드 실행시마다 컴퓨터에 CLASSPATH 환경변수를 설정할 필요가 없으며, 필요할 때마다 fileset 요소만 수정하면 됩니다만, 거의 대부분 한번 설정하고나서는 이 build.xml을 수정하지 않습니다. 이는 완전한(Complete) 빌드를 유지하기 쉽게 하기 때문입니다.


4. 타겟 정의

       <target name="prepare">

             <mkdir dir="${build.prod.dir}" />

       </target>

      

       <target name="compile" depends="prepare">

             <javac srcdir="${src.dir}" destdir="${build.prod.dir}">

                    <classpath refid="project.classpath" />

             </javac>

       </target>

타겟(target)은 빌드 단계로서 지정한 순서에 따라 실행될 일련의 '태스크(task)'들을 정의하는 빌드 단계입니다. prepare 타겟은 빌드 출력 디렉터리를 만들기 위하여 <mkdir> 태스크를 사용합니다. compile 타겟은 소스 파일을 컴파일 하고 prepare 타겟에서 생성된 디렉터리에 결과 클래스 파일들을 저장합니다. 타겟의 실행 순서는 중요하므로 depends 속성을 통해 타겟 간의 의존성을 만들어 순서를 지정한다. 의존성은 여러 개를 지정할 수 있으며, 타겟 이름을 콤마(,)로 구분하여 나열합니다. prepare 실행이 완료되면 javac 태스크를 실행하여 자바 컴파일러를 호출합니다. 컴파일러는 srcdir 속성의 값에 명시된 소스 폴더내의 자바 소스 파일들을 모두 컴파일 하고, 그에 상응하는 클래스 파일들을 destdir이 가리키는 디렉터리에 생성합니다. classpath 요소는 project.classpath가 가리키는 클래스 패스를 사용하라고 알려주는 역할을 합니다. 위에서 작성한 전체 build.xml 파일은 다음과 같습니다.

<?xml version="1.0"?>

<project name="spring_example" default="compile" basedir=".">

       <property name="build.dir"             location="build"/>

       <property name="build.prod.dir"         location="${build.dir}/prod"/>

       <property name="src.dir"                location="src"/>

       <property name="lib.dir"                location="lib"/>

      

       <path id="project.classpath">

             <pathelement location="${build.prod.dir}" />

             <fileset dir="${lib.dir}">

                    <include name="*.jar" />

             </fileset>

       </path>

      

       <target name="prepare">

             <mkdir dir="${build.prod.dir}" />

       </target>

      

       <target name="compile" depends="prepare">

             <javac srcdir="${src.dir}" destdir="${build.prod.dir}">

                    <classpath refid="project.classpath" />

             </javac>

       </target>

</project>

실제로 프로젝트에 참여하게 되면, 이보다 더욱 복잡하고 난해하게 짜여져있습니다만,
어떤식인지 이해할필요도없이 그냥 사용하면 되니, 그다지 문제될것 없습니다.
집적짜야한다면, 문제가 되겠지만서도 ^^;


출처 - http://c36wn.egloos.com/4235824












'IDE & Build > Ant' 카테고리의 다른 글

Step by Step Ant  (0) 2012.11.06
Apache Ant  (0) 2012.03.03
Posted by linuxism
,