Ant 를 쓰니 커맨드 라인에서의 작업이 무척이나 간편해집니다.
오늘은 뭐 별건 아니지만, 제가 쓰는 build.xml 화일을 소개해볼까 합니다. build.xml 화일이야 프로젝트에 맞도록 많이 바뀌겠지만, 오늘 이야기 하고자 하는 것은 가장 기본이 되는 부분입니다.
먼저 코드를 보시면..
<target name="init">
<property name="build" value="bin" />
<property name="home" value="." />
<property name="src" value="src" />
<property name="dist" value="dist" />
<property name="jarname" value="deskeyserver-1.0.jar" />
<property name="mainclass" value="com.shinnara.deskeyserver.DesKeyServer" />
</target>
<target name="compile" depends="init">
<mkdir dir="${build}" />
<javac srcdir="${src}" destdir="${build}" >
<classpath>
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>
</target>
<target name="makejar" depends="compile">
<mkdir dir="${dist}" />
<jar destfile="${dist}/${jarname}"
basedir="${build}" >
<manifest>
<attribute name="Main-Class" value="${mainclass}" />
</manifest>
</jar>
</target>
<target name="run" depends="compile">
<java classname="${mainclass}">
<classpath>
<pathelement path="${build}" />
<fileset dir="lib">
<include name="**/jar" />
</fileset>
</classpath>
</java>
</target>
<target name="main" depends="compile" />
<target name="clean" depends="init">
<delete dir="${build}" />
</target>
<target name="clean-bulid" depends="clean,compile" />
</project>
내용은 뭐 특별히 소개할만한게 없을지도 모르겠습니다만, ant 를 처음 사용하시는 분들을 위해 소개해봅니다.
제 작업 디렉토리를 보면 다음과 같습니다.
CVS/ bin/ build.xml dist/ lib/ src/
CVS 를 쓰다보니 CVS 라는 디렉토리가 있네요. 이부분은 그냥 넘어가도록 하고, 소스가 있는 src/, 컴파일된 클래스 파일이 있는 bin/ , jar 파일이 위치하는 dist/ , 프로그램에서 참조하는 라이브러리가 있는 lib/ 그리고 위에 소개한 build.xml 입니다. bin/ 과 dist/ 는 ant 를 통해 자동으로 생성되는 디렉토리입니다. 물론 만들어놓아도 상관은 없습니다.
소스를 작성한 후, 컴파일을 하기 위해서는 현재 디렉토리에서 ant 를 입력합니다. ant 뒤에 target 을 지정할 수 있습니다. 지정하지 않을 경우 project 에서 default 로 명시한 target 을 수행하게 됩니다.
위의 빌드 파일을 보면
기본으로 설정된 target 이 main 임을 알 수 있습니다. 따라서 명령행에서 ant 라고 치거나 ant main 이라고 치는 것은 동일한 명령이 됩니다.
ant 에서 target 은 일련의 작업의 모음입니다. 작업은 task 라고 불리는데 디렉토리를 만들거나, 컴파일을 하거나, jar 로 묶는 등 ant 가 제공하는 기능을 의미합니다. ant 에서는 core task 와 optional task 의 두 부류의 task 를 지원하며, optional task 의 경우 별도의 라이브러리가 필요할 수 있습니다.
이름이 main 인 target 을 살펴볼까요?
별 내용없이 depends="compile" 이라고 되어 있네요. depends 는 선행조건을 의미합니다. 즉 main 이 실행되기 위해서는 compile 이 되어 있어야 한다는 것이지요.
그럼 이제 compile 을 살펴볼까요?
<mkdir dir="${build}" />
<javac srcdir="${src}" destdir="${build}" >
<classpath>
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>
</target>
depends 에 init 가 있는 걸 보니, init가 뭘 하는지도 알아야겠군요. 위의 소스를 보면 여러 property들을 정의하고 있는 것을 찾아볼 수 있을 것입니다. ant 에서 property 를 참조하는 방법은 ${property_name} 입니다. 위의 소스를 보면 ${build} 라는 것을 볼 수 있는데, init 에서 build 에 대해 bin 으로 정의하고 있으므로
는
과 같은 내용이라 할 수 있습니다.
javac 를 이용해서 컴파일을 하기 전에 먼저 디렉토리를 만드는 군요. 그리고나서 javac 를 이용하여 컴파일을 합니다. 커맨드라인에서 컴파일을 할 때 가장 귀찮은 것이 클래스 패스를 설정하는 것인데 ant 를 사용하면 무척이나 쉽게 할 수 있습니다. 위의 코드에서 fileset 부분은 lib 라는 디렉토리 밑에 있는 모든 .jar 파일을 클래스패스에 추가하라는 의미입니다.
그 외에도 컴파일러 옵션을 추가 할 수 도 있습니다.
이제 컴파일 부분이 끝났습니다. 컴파일을 했으면 실행을 시켜봐야 겠지요?
<java classname="${mainclass}">
<classpath>
<pathelement path="${build}" />
<fileset dir="lib">
<include name="**/jar" />
</fileset>
</classpath>
</java>
</target>
compile 부분과 별로 다른게 없군요..
다음은 makejar 입니다.
<mkdir dir="${dist}" />
<jar destfile="${dist}/${jarname}"
basedir="${build}" >
<manifest>
<attribute name="Main-Class" value="${mainclass}" />
</manifest>
</jar>
</target>
여기서 주의 깊게 볼만한 내용은 manifest 부분입니다. jar 로 묶을 때 Main-Class 를 지정할 수 있습니다.
그외의 작업으로 clean, clean-build 가 있지만 너무 쉬운 내용이라 그냥 넘어가도록 하겠습니다.
즐거운 프로그래밍하세요~ ^^
이올린에 북마크하기
이올린에 추천하기
maverick-ant.zip
ant_jinho.pdf
댓글을 달아 주세요