압
축을 풀어보면 뭔가 잡다한 파일들이 많이 보인다. 우선 $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 를 기동시킨다던지 하는 것들도 만들 수 있다.
또한, 테스트 케이스를 만들고 실행해 볼 수 있습니다.