Egloos 728x90

구글 애널리틱스


2009/07/06 18:46

[ Ant ] 이제야 사용법을 이해할 수 있을 것 같아요 ㅠㅁㅠ ▷ 프로그래밍 관련




  스트럿츠를 공부하다 보니 거의 필수처럼 나오는 것이 Ant던데, 정작 사용법에 대해서는 제대로 나온 것이 없더군요.

  아니 정확히 말하면, Ant 실행방법 정도는 소개가 나오지만 정작 그 내부의 어지럽게 난무하는 XML 코드에 대해서는 설명이 없더군요. 아니 이것도 정확히 말하면, 어느 정도 소개는 나오지만 그 연결관계를 처음 보는 사람 입장에서는 이해하기 힘들달까요...

  뭐, Ant 없다고 개발 못 하는 것도 아니고...중얼중얼... >-<ㅇ

  그런 식으로 포기하고 지내고 있었습니다만... 오늘도 여전히 프로젝트를 위해 필요한 정보들을 모으고 있다가 발견한 이것.


우선 ant 를 다운로드 받는다. 물론 eclipse 를 사용하면 기본적으로 탑재가 되어있지만, 때에 따라서는 eclipse 같은 IDE 툴을 사용하지 못할 수 도 있기 때문에 일단 배재시키고 이야기해 보자.

압 축을 풀어보면 뭔가 잡다한 파일들이 많이 보인다. 우선 $ANT_HOME/bin 을 환경변수의 PATH 에 잡고 커맨드 창에서 ant 라고 쳐 보면 아래와 같은 메시지가 나올 것이다. 그러면 일단 설치는 성공~ (환경변수를 잡기 싫으면 ant 실행시 경로포함하여 실행하세요)

Buildfile: build.xml does not exist!
Build failed

메시지를 살펴보면 build.xml 파일이 존재하지 않는다고 한다. ant 는 기본적으로 build.xml 이라는 이름을 가진 파일에 설정을 하고 되어있다.

그럼 여기서 목표를 잡아보면 ant 를 이용하여 컴파일을 해보자.

우선, 커맨드 창에서 java 컴파일을 했던 방법을 떠 올려보자. 그동안 IDE 툴에 너무 익숙해져 있어서 다소 생소하게 느껴지지만 기억을 다듬어 보면 아래와 같은 형태로 컴파일을 한다.

javac -cp 필요한라이브러리 xxx.java 
(너무 기초부터 나온다고 뭐라하지 마세용.)

그럼 ant의 설정파일인 build.xml 의 구조를 간단히 살펴보자.

<?xml version="1.0" encoding="UTF-8"?>
<project name="agilejava" default="build" basedir=".">
</project>

가 장 기본이 되는 형태이다. default 값이 build 로 설정되었다는 의미는 ant 만 실행시에 build 라는 타겟을 찾아서 실행하라는 의미이고 basedir 의 값이 '.'  build.xml  과 같은  레벨을 기준으로 상대경로를 잡는다는 의미이다.

다음으로 아래와 같은 property 들을 정의할 수 있다. 코딩으로 따지자면 선언해 놓은 상수(?) 정도라고 할 수 있겠다.
자주 사용하는 것들을 미리 등록해 놓으면 편하게 쓸 수 있다. value 대신에 location 을 사용해도 무방하다.

    <property name="project.name" value="AntTask"/>
    <property name="PROJECT" value="D:/workspace/${project.name}" />
    <property name="build.dir" value="${PROJECT}/build"/>
    <property name="dist.dir" value="${PROJECT}/dist"/>
    <property name="src.dir" value="${PROJECT}/src"/>


    필요한 라이브러리들의 클래스 패스를 잡는다.
    스프링으로 따지자면 ref 속성으로 쓰기위한 하나의 bean 을 등록한다고나 할까?

    <path id="project.classpath">
        <fileset dir="${PROJECT}/web/WEB-INF/lib" includes="**/*.jar" />
    </path>

   
    우리가 이번글에서 목표로 하는 컴파일이다. target 속성에 depends 라는 녀석이 보이고 init 이라는 값을 가지고 있다.
    build 타겟을 실행할 때  init  타겟을 먼저 수행하라는 의미이다.  init 내용은  더 밑에서 살펴보고  build 를 좀 더  봐보자.
    javac 라는 녀석이 보인다.  컴파일을  수행하라는 이야기다.
    src ==> 소스 디렉토리,   destdir ==>  컴파일 된  클래스 파일이 들어갈 디렉토리 includes 는 컴파일 할 대상(여기서는 모든경로의 모든 java 파일을 설정). 나머지 옵션은 에러추적용 이므로 패스~
    위에서 설정한 라이브러리 패스를 사용하여 컴파일을 한다.

    <target name="build" depends="init">
        <javac srcdir="${src.dir}" destdir="${build.dir}" includes="**/*.java" debug="true" failonerror="true">
            <classpath refid="project.classpath" />
        </javac>
    </target>

    init 타겟은 별 내용이 없다. 시작시와 끝날시에 메시지 보여주고 컴파일 시에 필요한 디렉토리를 생성시킨다.
    <target name="init">
        <echo message="init... start" />
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
        <echo message="init... end" />
    </target>

이제 실행을 해 보면 아래와 같은 형태의 메시지를 볼 수 있다.
>ant build

Buildfile: build.xml

init:
     [echo] init... start
     [echo] init... end

build:
    [javac] Compiling 1 source file to D:\workspace\AntTask\build

BUILD SUCCESSFUL
Total time: 4 seconds
빌드가 이루어지면 컴파일이 된 것을 확인할 수 있다.

 

간단한 타겟 몇 가지를 살펴보겠습니다.

* 디렉토리, 파일 지우기

    <target name="clean">
        <echo message="Cleaning ${build.dir}" />
        <delete dir="${build.dir}" />
    </target>

위의 내용만 봐도 뭐 하는 녀석인지 바로보인다. 빌드를 시켰던 디렉토리를 깨끗하게 지우는 타겟이다.
기존의 내용이 남아있다면 나중에 괜한 고생을 하게 될지도 모른다. 특히, 프로젝트가 커졌을 경우 소스코드와 빌드내용이 동기화가 되지 않을 가능성이 높다.
이클립스의 clean 기능과 일맥상통한다. (해당 프로젝트의 빌드를 모두 지워버린다.)

* 파일 복사하기

다음으로 파일복사에 대해 간단히 살펴보자.
빌드된 파일을 특정한 디렉토리로 복사를 한다.
예를 들면 소스 컴파일이 성공을 했을경우 WAS 에 해당 클래스를 복사해 넣는것이다.

    <target name="deploy" depends="build">
        <copy todir="${deploy.dir}" overwrite="true">
            <fileset dir="${build.dir}" >
               <include name="**/*.class" /> 
            </fileset>
        </copy>
    </target>

눈에 띄는 옵션은 depends="build" 와 overwrite="true" 이다.
이 또한, 이름이 직관적이라 바로 알 수 있다. deploy 를 하기전에 먼저 build 를 하고 동일한 파일이 존재할 경우 덮어써라~ 이다.

* jar 파일 만들기
빌드가 이루어진 클래스 파일을 그냥 사용할 수도 있지만, 배포를 위해서 jar 파일로 묶어서 사용할 수도 있다.
라이브러리를 배포할 경우 많이 사용하게된다.

    <target name="deployjar" depends="build">
        <echo message="create jar file : ${dist.dir}/${deploy.name}.jar" />
        <jar jarfile="${dist.dir}/${deploy.name}.jar" update="true">
            <fileset dir="${build.dir}">
                <include name="**/*.*"/>
            </fileset>
        </jar>
    </target>

역시나 jar 를 만드는 것이니 jar 부분이 눈에 들어온다. 빌드가 된 파일셋을 이용하여 지정한 이름으로 jar 파일을 생성시킬 수 있다.

* 여러 target 한꺼번에 실행하기
말 그대로 이다. 지금까지는 한번에 하나의 타겟을 실행했었고, 해당 target 에서 depends 를 걸었었다.
여러 타겟 실행하는 것도 위의 예제들에 이미 힌트가 나와있다.
depends 에 여러 타겟을 컴마(,)를 구분자로 넣어놓으면 순차적으로 실행이 된다. (너무 당연한 이야기인가?? ^^)

    <target name="all" depends="clean, cleanjar, init, deployjar" >
        <echo message="execute all task.... " />
    </target>

예제를 간단하게 만들면서 본이 아니게 중간에 echo 를 계속 사용하게 되었다.
해당 메시지를 보여주면 특정 타겟을 실행할 때 메시지를 보여줄 수 있어서 나름 쓸만한 것 같다.
이외에도 ftp 를 이용하여 파일을 전송한다던지, 특정 WAS 를 기동시킨다던지 하는 것들도 만들 수 있다.
또한, 테스트 케이스를 만들고 실행해 볼 수 있습니다.

[출처] Ant 사용법 2|작성자 창조알봉



  우와아앙! 이거야! 난 이런 설명을 원했어~~!!

  build.xml의 구성 요소들과, 그 쓰임새를 처음부터 차례대로 설명을 해 주시니 너무나 이해하기가 쉽더군요. 엉엉ㅠㅁㅠ

  참고로 Ant 검색 하면 많이 보이는 사전형 설명은 위 출처 링크로 들어가 'Ant 사용법 1'에도 나와있습니다.


덧글

  • 흠.. 2014/05/27 15:13 # 삭제 답글

    감사합니다 이해하는데 도움되었습니다.^^
  • 별소리 2014/06/04 18:09 #

    도움이 되셨다니 잘 됐네요 ^^
  • 2018/07/17 01:47 # 삭제 답글

    정말 오래 구글링하고 여러 글을 봤었는데..
    그래서 도대체 ant가 뭐라는거지... 라는 의문만 남았었습니다.

    덕분에 속이 뻥 뚫리는 기분이네요 ㅠㅠ 감사합니다!
댓글 입력 영역

애드센스336x280

알라딘TTB-Egloos(하단-일반)



이 이글루를 링크한 사람 (블랙)

36