티스토리 뷰
Ant Build는 이제는 잘 쓰이지 않지만 종종 maven이나 gradle이 아닌 일반적인 Dynamic Web Project로 프로젝트를 구성하는 경우 사용된다. 일을 하며 많은 시간을 이 Ant Build를 사용했고 그중 가장 일반적인 모습의 Ant Build Script를 작성해보고 이에 대한 설명을 하려고 한다.
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="sampleproject" default="build_project" basedir=".">
<description>sampleproject build</description>
<property name="webapp.dir" value="."/>
<property name="src.dir" value="${webapp.dir}/src"/>
<property name="classes.dir" value="${webapp.dir}/webapp/WEB-INF/classes"/>
<property name="lib.dir" value="${webapp.dir}/webapp/WEB-INF/lib"/>
<property name="lib.dev.dir" value="${webapp.dir}/lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
<fileset dir="${lib.dev.dir}" includes="**/*.jar"/>
</path>
<!-- Clean classes directory -->
<target name="clean">
<delete dir="${classes.dir}" />
</target>
<!-- Compile -->
<target name="compile">
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" encoding="utf-8" classpathref="classpath" includeantruntime="false" />
</target>
<!-- Copy Properties -->
<target name="copy_prop">
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.properties" />
</fileset>
</copy>
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.properties.sample" />
</fileset>
<globmapper from="*.properties.sample" to="*.properties"/>
</copy>
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.xml" />
</fileset>
</copy>
</target>
<target name="build_project" depends="clean, compile, copy_prop" />
</project>
일단 전체 Build Script를 올려봤다. 내용은 꽤 길지만 별 내용은 없는 편이다.
Build Script를 짤때 저마다의 스타일이 있지만 필자는 이 Ant Script 안에서 배포까지 하는것은 별로 선호하지 않는다. 배포는 Jenkins에서 수행을 하는것을 좋아하고 Ant는 오직 빌드하는 목적으로 주로 사용을 한다.
위에서부터 하나씩 살펴보자.
project 및 property
<project name="sampleproject" default="build_dev" basedir=".">
<description>sampleproject build</description>
<property name="webapp.dir" value="."/>
<property name="src.dir" value="${webapp.dir}/src"/>
<property name="classes.dir" value="${webapp.dir}/webapp/WEB-INF/classes"/>
<property name="lib.dir" value="${webapp.dir}/webapp/WEB-INF/lib"/>
<property name="lib.dev.dir" value="${webapp.dir}/lib"/>
프로젝트의 이름을 설정할 수 있고 default build를 설정할 수 있다. default build라고 하는것은 Ant Script의 구성 요소 중 Job의 단위인 target이 있는데 Ant Script를 그냥 실행시켰을때 어떤 target을 수행할것인지 정해줄 수 있다.
아래는 property 정의를 한다. pom.xml이나 다른 곳에서 property 정의를 하는것과 용도는 같다. 실수를 줄여주고 중복을 방지하기 위해 필요한 경로들에 대해 이곳에 정의를 해놓는다.
Classpath
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
<fileset dir="${lib.dev.dir}" includes="**/*.jar"/>
</path>
말 그대로 클래스패스를 정의하는 역할을 한다. 다른것과 달리 이건 path 태그를 사용한다. 빌드를 하는데 필요한 library를 정의한다. 프로젝트에 여기저기 library가 흩여져 있으면 이곳에 모두 모아서 정의를 해준다.
Clean
<target name="clean">
<delete dir="${classes.dir}" />
</target>
clean은 전에 빌드한 결과물에 대해서 삭제를 해주는 역할을 한다. 기존 빌드를 지우지 않으면 빌드 결과물이 꼬일수 있으므로 웬만하면 clean을 먼저 하고 빌드를 하는것을 권한다.
Compile
<target name="compile">
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" encoding="utf-8" classpathref="classpath" includeantruntime="false" />
</target>
Java Source와 위에서 정의한 Classpath를 토대로 소스 빌드를 수행한다. 빌드의 결과물은 class 파일로 생성이 되고 이것을 destdir로 정의한 곳으로 보낸다. javac에는 위와 같이 다양한 속성들을 설정할 수 있다. 각 속성의 설명은 다음과 같다.
속성 | desc |
scrdir | compile할 java 파일이 위치한 경로 (필수) |
destdir | compile한 class파일들이 위치할 경로 |
debug | compile시 debug정보를 출력할지 여부 (off) |
encoding | 소스의 encoding 설정 |
classpathref | 참조할 classpath |
includeantruntime | 정의한 classpath 외에 ant의 runtime library를 추가여부 |
verbose | compile시 진행상황을 보여줄 것인지 여부 (no) |
failonerror | build 실패시 에러를 표시할 것인지 여부 (true) |
Copy property, xml
<target name="copy_prop">
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.properties" />
</fileset>
</copy>
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.properties.sample" />
</fileset>
<globmapper from="*.properties.sample" to="*.properties"/>
</copy>
<copy todir="${classes.dir}" overwrite="true" >
<fileset dir="${src.dir}">
<include name="**/*.xml" />
</fileset>
</copy>
</target>
property라고 써놨지만 application에서 공통으로 사용되는 외부 환경설정파일을 뜻한다.
copy todir은 이곳에다가 복사를 하겠다라는 것이다. 무엇을? fileset에 있는 properties로 끝나는 모든 파일들을 말이다.
즉 소스에 있는 properties로 끝나는 모든 파일들을 ${classes.dir} 로 정의한 곳으로 복사하겠다는 것이다.
아래에 나오는 globmapper는 치환을 해주는 역할을 한다. 즉 properties.sample이라는 파일이 있으면 복사할때 이건 모두 properties로 치환해서 복사를 하라는 뜻이다.
이것을 응용하여 phase (dev, qa, prd) 에 맞게 파일을 치환해서 구성을 할 수 있다.
Build
<target name="build_project" depends="clean, compile, copy_prop" />
위의 여러 과정들을 엮어서 하나의 target으로 정의한다. depends라는 attribute가 이런 역할을 해주고 앞에서부터 순서대로 정의된 target을 실행시킨다. 보통은 위처럼 clean해서 비우고 compile하고 추가로 파일을 넣어준다.
그리고 다른곳에서 이 Ant Build를 활용하기 위해서는 이 build_project를 이용을 한다.
만약 Jenkins에서 이 build.xml 파일을 활용한다고 치면 다음과 같이 설정할 수 있다.
Build File에는 파일명 (default는 build.xml이라 안적어줘도 된다.), 그리고 Targets은 우리가 만들어 놓은 build_project를 입력을 하면 디렉토리에 프로젝트가 잘 올라가 있으면 빌드가 수행되는 것이다.
이 외에도 Ant Script를 통해 많은 일을 할수 있지만 그 일들은 모두 Jenkins에서도 가능하다. 필자가 Jenkins에서 하는것을 더 선호하는 이유는 소스상에서 수정을 하지 않아도 되기 때문이다.
끝!
'CI,CD > Build' 카테고리의 다른 글
Nexus settings.xml 파일 없이 3rd party library 가져오기 (mirror & repositories) (0) | 2021.03.22 |
---|---|
maven project pom.xml : unknown error line 1 오류 (0) | 2021.01.11 |
Ant build 시 error : unmappable character for encoding UTF-8 해결방법 (0) | 2020.09.29 |
Could not calculate build plan : one of its dependencies could not be resolved 오류 해결하기 (0) | 2020.08.18 |
linux 환경에서 maven repository settings.xml 설정하기 (0) | 2020.07.27 |