예제로 살펴보는 build.xml
1. online 에서 구할 수 있는 예제
Graha 라이브러리의 build.xml 파일 과 Java 실행기 프로그램의 build.xml 파일 은 java 파일을 컴파일 하고, 여러 형태(jar, war, tar, zip) 로 패키징 하고, Java 프로그램을 실행한다.
2. Graha 라이브러리의 build.xml 파일에 대한 설명
2.1. Graha 라이브러리의 기본적인 디렉토리 구조
- src : Java 소스코드
- bin : Java class 파일(Apache Ant로 Java 소스코드를 컴파일 하여, 이 디렉토리에 class 파일을 생성한다)
- package : jar 로 패키징된 파일(Apache Ant로 src, bin 디렉토리의 파일들을 jar 로 압축한다)
- /opt/java/lib/ : 컴파일에 필요한 라이브러리가 위치한 디렉토리
2.2. Java 소스파일을 컴파일하는 방법
ant compile
- 파일명이 지정되지 않았으므로, 기본값인 build.xml 파일을 읽는다(파일명을 지정하기 위해서는 "-f build.xml" 과 같은 옵션을 추가한다).
- name 속성이 compile 인
<target>
을 찾아, 그 안에 기술된 Ant Task 를 실행한다.
compile 옵션을 생략한 경우,
<project>
의 default 속성값을 이용하므로, 결과는 같다.
2.3. build.xml 설명
2.3.1. <property>
요소
처음 2줄의 <property>
요소는 다음과 같다.
<property name = "base.dir" value = "."/> <property name = "src.dir" value = "${base.dir}/src"/>
2번째 줄은 <property>
를 정의하는 예제이기도 하지만, 사용하는 예제이기도 하다.
<property>
는 중복을 줄이기 위해서 사용되지만, build.xml 파일의 구조화 혹은 가독성을 높이기 위해 사용되기도 한다.
2.3.2. <presetdef>
요소
<presetdef name="javac"> <javac includeantruntime="false" /> </presetdef>
<presetdef>
요소는 새로운 Ant Task 를 정의하기 위해 사용되지만, 위와 같이 <javac>
Task를 다시 정의하는 방식도 가능하다.
2.3.3. <path>
요소
<java>
나 <javac>
Task 에서 classpath 에 공급될 것을 정의하기 위해 사용된다.
<path id = "master-classpath"> <!-- <fileset dir = "${base.dir}/lib"> <include name = "*.jar"/> </fileset> --> <pathelement path = "${build.dir}"/> </path>
여기서 정의된 것은 다음과 같이 참조된다.
<classpath refid = "master-classpath"/>
<path>
요소는
1개의 jar 파일이나 경로를 공급하는 <pathelement>
를 가질 수 있지만,
주석으로 막힌 부분과 같이 디렉토리 아래의 모든 jar 파일을 공급하는 식의 <fileset>
을 하위요소로 가질 수 있다.
jar 파일을
<pathelement>
로 1개씩 나열하는 대신,<fileset>
으로 lib 디렉토리 아래의 모든 jar 파일을 참조하게 한 후에, 의존하는 jar 파일을 lib 디렉토리에 복사하는 방법이 더 일반적이다. 후자의 경우 build.xml 파일을 변경할 일이 줄어들지만, 의존성있는 jar 라이브러리를 엄격하게 관리하는데 방해가 되기도 한다.
2.3.4. 디렉토리는 만들거나(<mkdir>
) 삭제하는(<delete>
) Task
다음은 컴파일을 하기 전에 class 파일이 위치하게 될 디렉토리를 만드는 작업을 수행한다.
<target name="depends"> <mkdir dir="${build.dir}" /> <mkdir dir="${tomcat10.dir}" /> </target>
다음은 class 파일이 위치하는 디렉토리를 지워버리는 작업을 수행한다.
<target name="clean"> <delete verbose="true" dir="${build.dir}" /> </target>
verbose 속성은 삭제한 파일목록을 표시한다.
2.3.5. 소스코드를 컴파일하는(<javac>
) Task
다음은 소스코드를 컴파일하는(<javac>
) Task의 예제이다.
<target name="compile" depends="depends"> <javac destdir = "${build.dir}" deprecation="true" debug="true" debuglevel="lines,vars,source" includeAntRuntime="false" optimize="true" nowarn="off" target="1.7" source="1.7" > <src path = "${src.dir}"/> <classpath refid = "master-classpath"/> </javac> </target>
<javac>
Task 의 destdir 속성과 <src>
, <classpath>
요소를 제외한 나머지 것들은 필수적이지 않지만, 관행적으로 많이 사용되는 것들이다.
2.3.6. <target>
요소의 depends 속성에 대해서
<target>
요소의 depends 속성을 사용하면, 먼저 실행되어야 하는 다른 <target>
요소를 지정할 수 있다.
war 파일을 패키징 하기 전에, jar 파일을 패키징하고, 그 전에 컴파일 하고, 그 전에 bin 디렉토리를 만드는 식이다
2.3.7. 패키징(<jar>
) Task
다음은 jar로 패키징하는 예제이다.
<target name="package" depends="compile"> <jar destfile="${package.dir}/${app.name}.${app.version}.jar"> <fileset dir="${build.dir}" includes="kr/**/*.class"/> <fileset dir="${base.dir}" includes="README.md,LICENSE"/> <fileset dir="${src.dir}" includes="kr/**/*.java, kr/**/*.xsl, kr/**/*.xml, kr/**/*.properties"/> </jar> </target>
2.3.8. 다른 패키징(<war>
, <tar>
, <zip>
) Task
이 예제는 Java 실행기 프로그램의 build.xml 파일 에서 찾을 수 있다.
2.3.9. Java 프로그램을 실행하는(<java>
) Task
"kr.graha.util.Converter" 를 실행시키는 예제이다.
<target name="generate-tomcat10" depends="compile"> <java classname="kr.graha.util.Converter" fork="true"> <arg value="${base.dir}" /> <classpath refid = "master-classpath"/> </java> </target>
"kr.graha.util.Converter" 는 Apache Tomcat 10 을 위해서 import 구문을 변경시키는 유틸리티이며, Graha ~ Graha 응용프로그램과 import 구문을 작성하는 규칙이 동일한 경우에만 사용할 수 있다.