자바소스를 올려 두고 ant를 이용하면 손쉽게 모든 파일을 컴파일/실행/복사/jar 생성 등을 할 수 있습니다.
관련 한 글을 퍼다가 아래에 담습니다. 다른 언어도 되는지는 잘 모르겠습니다. 일단 지금 하고 있는 자바
개발 건에는 약간 도움이 될려고 하고 있습니다. 다음 장엔 ant의 옵션에 대해서 아래 보다 자세히 정리 하도록
하겠습니다.
▩ Eclipse ANT(Another Neat Tool)
– XML 기반으로 자바 파일의 컴파일 및 압축, 배포, 복사등의 작업을
운영체제에 상관없이 실행할 수 있습니다.
– XML 기반이라 기초적인 XML문법만 알면 배우고 사용하기 쉽습니다.
– Ant자체 내에는 JVM이 별도로 운영이 되어 java 컴파일, jar 패키징 작업을
자체적으로 수행한다.
– EJB Compile과 패키징 작업 그리고 J2EE 개발을 지원하는 기능(XML스크립트 자동생성)이
내장되어 있다.
– FTP, Telnet, Application Server, SQL 명령어들을 배치 자동화에 사용할 수 있다.
– 용어
. TASK: ANT에서 지원화는 작업의 단위
. TARGET: TASK의 집합으로 구성되어 있는 작업 단위
– 속성의 정의
<property name=”build.dir” value=”./bin”/>
위 문장은 String build.dir = “./bin”과 같습니다.
– ${ } :선언된 속성을 가져다 사용합니다.
– Eclipse의 ANT Plugin
. eclipse 2.X 에는 Ant 1.5.3버전이 포함되어 있습니다.
. eclipse 3.X 에는 Ant 1.6.5버전이 포함되어 있습니다.
▩ 기본 태스크의 이해 및 태스크의 실습
– eclipse에서 [java project]를 이용
. project name : helloAnt(or ejb_c15_HelloAnt)
. source folder: src
. output folder: bin
. package name : helloAnt
. build xml file folder: build
1. java 태스크
– 컴파일된 자바 프로그램을 실행합니다.
>>>>> HelloAnt.java
package helloAnt;
public class HelloAnt {
public static void main(String[] args) {
System.out.println(“—————“);
System.out.println(“Hello Ant!”);
System.out.println(“—————“);
}
}
>>>>> build/build.xml
<?xml version=”1.0″ encoding=”euc-kr” ?>
<project name=”helloAnt” default=”execute” basedir=”.”>
<!–속성, 변수, 현재 build 폴더임으로 상위 폴더로 이동 –>
<property name=”build.dir” value=”../bin” />
<!–타겟–>
<target name=”execute”>
<!–자바 실행 태스크–>
<java classpath=”${build.dir}” classname=”helloAnt.HelloAnt”>
</java>
</target>
</project>
– Eclipse에서의 실행
Context 메뉴에서 ‘Ant Build’합니다.
2. javac 태스크
– 자바 프로그램을 컴파일합니다.
<javac srcdir= “${src.dir}” — 소스 폴더 지정
destdir=”${build.dir}” — 컴파일되어 저장될 폴더
includes=”**/*.java” — 컴파일할 파일 패턴, **: 모든 하위 폴더 포함
excludes=”**/*.class” — 컴파일에서 제외할 파일 패턴
classpath=”${classpath}” — 컴파일시 클래스 참조 경로
/>
>>>>> build2.xml
<?xml version=”1.0″ encoding=”euc-kr” ?>
<!–default: 처음 시작 target 지정–>
<project name=”helloAnt” default=”execute” basedir=”.”>
<!–소스 디렉토리–>
<property name=”src.dir” value=”../src”/>
<!–컴파일 되서 class로 변환되어 들어갈 경로–>
<property name=”build.dir” value=”../bin”/>
<!–컴파일시 참조할 경로–>
<property name=”classpath” value=”../bin”/>
<target name=”compile”>
<javac srcdir= “${src.dir}”
destdir=”${build.dir}”
includes=”**/*.java”
excludes=”**/*.class”
classpath=”${classpath}”
/>
</target>
<!–depends:의존하는 태스크를 지정하며 나중에 실행됩니다.–>
<target name=”execute” depends=”compile”>
<java classpath=”${build.dir}” classname=”helloAnt.HelloAnt”>
</java>
</target>
</project>
3. jar 태스크
– 관련파일을 압축하여 ‘*.jar’파일을 생성합니다.
– fork옵션에서 true을 지정해 새로운 VM을 실행해주어야만 가능하다.
<target name=”create_manifest” depends=”compile”>
<manifest file=”${src.dir}/MANIFEST.MF”> — jar 파일 명세서
<attribute name=”Built-By” value=”${user.name}”/>
<!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
<attribute name=”Main-Class” value=”${main.class}”/>
</manifest>
</target>
<target name=”jars” depends=”create_manifest”>
<!– ./helloAnt2.jar –>
<jar
destfile=”${basedir}/${jars.name}” — 만들어질 jar 파일명
basedir=”${build.dir}” — 압축할 디렉토리
includes=”**/*.class” — 압축할 파일 패턴 지정
excludes=”**/*.java” — 압축에서 제외할 파일
compress=”true” — 압축 옵션
update=”true” — 기존에 존재하면 덮어씀
index=”true” — 압축 목록 생성
manifest=”${src.dir}/MANIFEST.MF”> — Manifest 파일 지정
<!–압축할 파일들–>
<fileset dir=”${build.dir}”/> — 압축할 파일 집합 지정
</jar>
</target>
<target name=”execute” depends=”jars”>
<!–./helloAnt.jar–>
<java jar=”${basedir}/${jars.name}” — 실행할 jar 파일명
fork=”true” — 새로운 JVM 실행
failonerror=”true” — 에러 발생시 실패 처리
maxmemory=”128m”
/>
</target>
>>>>> build3.xml
TASK Sequence: execute —> jars —> create_manifest —> compile
<— <— <— return
<?xml version=”1.0″ encoding=”euc-kr” ?>
<project name=”helloAnt” default=”execute” basedir=”.”>
<property name=”project.name” value=”${ant.project.name}”/>
<property name=”project.version” value=”1.0″/>
<!–실행을 시작하는 메인 클래스–>
<property name=”main.class” value=”helloAnt.HelloAnt”/>
<!–압축파일 이름 helloAnt2.jar –>
<property name=”jars.name” value=”${ant.project.name}.jar”/>
<!–컴파일할 소스가 있는 디렉토리–>
<property name=”src.dir” value=”../src”/>
<!–컴파일되어 class로 변경되어 들어갈 폴더–>
<property name=”build.dir” value=”../bin”/>
<!–컴파일시 참조할 클래스 폴더–>
<property name=”classpath” value=”../bin”/>
<property name=”user.name” value=”개발자”/>
<target name=”compile”>
<javac srcdir= “${src.dir}”
destdir=”${build.dir}”
includes=”**/*.java”
excludes=”**/*.class”
classpath=”${classpath}”
/>
</target>
<target name=”create_manifest” depends=”compile”>
<manifest file=”${src.dir}/MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
<attribute name=”Main-Class” value=”${main.class}”/>
</manifest>
</target>
<target name=”jars” depends=”create_manifest”>
<!– ./helloAnt.jar –>
<jar destfile=”${basedir}/${jars.name}”
basedir=”${build.dir}”
includes=”**/*.class”
excludes=”**/*.java”
compress=”true”
update=”true”
index=”true”
manifest=”${src.dir}/MANIFEST.MF”>
<!–압축할 파일들–>
<fileset dir=”${build.dir}”/>
</jar>
</target>
<target name=”execute” depends=”jars”>
<!–./helloAnt.jar–>
<java jar=”${basedir}/${jars.name}”
fork=”true”
failonerror=”true”
maxmemory=”128m”
/>
</target>
</project>
4. copy, echo, delete, mkdir 태스크
– copy: 파일을 복사합니다.
– delete: 파일을 삭제합니다.
– mkdir: 디렉토리를 생성합니다.
>>>>> build4.xml
TASK Sequence: start.copy –> execute –> jars –> javadoc –> create_manifest –> compile
<– <– <– <– <– return
<?xml version=”1.0″ encoding=”euc-kr” ?>
<project name=”helloAnt” default=”start.copy” basedir=”.”>
<property name=”project.name” value=”${ant.project.name}”/>
<property name=”project.version” value=”1.0″/>
<!–실행을 시작하는 메인 클래스–>
<property name=”main.class” value=”helloAnt.HelloAnt”/>
<!–압축파일 이름–>
<property name=”jars.name” value=”${ant.project.name}.jar”/>
<!–컴파일할 소스가 있는 디렉토리–>
<property name=”src.dir” value=”../src”/>
<!–컴파일되어 class로 변경되어 들어갈 폴더–>
<property name=”build.dir” value=”../bin”/>
<property name=”classpath” value=”../bin”/>
<property name=”user.name” value=”개발자”/>
<property name=”backup.dir” value=”backup”/>
<target name=”compile”>
<javac srcdir= “${src.dir}”
destdir=”${build.dir}”
includes=”**/*.java”
excludes=”**/*.class”
classpath=”${classpath}”
/>
</target>
<target name=”create_manifest” depends=”compile”>
<manifest file=”${src.dir}/MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
<attribute name=”Main-Class” value=”${main.class}”/>
</manifest>
</target>
<target name=”jars” depends=”create_manifest”>
<!– ./helloAnt2.jar –>
<jar destfile=”${basedir}/${jars.name}”
basedir=”${build.dir}”
includes=”**/*.class”
excludes=”**/*.java”
compress=”true”
update=”true”
index=”true”
manifest=”${src.dir}/MANIFEST.MF”>
<!–압축할 파일들–>
<fileset dir=”${build.dir}”/>
</jar>
</target>
<target name=”execute” depends=”jars”>
<!–./helloAnt.jar–>
<java jar=”${basedir}/${jars.name}”
fork=”true”
failonerror=”true”
maxmemory=”128m”
/>
</target>
<target name=”start.copy” depends=”execute”>
<!–폴더를 생성합니다.–>
<mkdir dir=”${backup.dir}”/>
<!–기본 디렉토리에 생성된 jar파일을 backup 폴더로 복사합니다.–>
<copy file=”${basedir}/${jars.name}” todir=”${backup.dir}” overwrite=”true”/>
<!–기본 디렉토리에 생성된 jar파일을 삭제합니다.–>
<delete file=”${basedir}/${jars.name}”/>
</target>
</project>
5. property를 다른 파일로 분리한 경우
– 속성을 지정시 불필요한 공백이 추가되면 경로가 인식이 안되며 특히 문장의 뒤에
공백이 있으면 안됩니다.
>>>>> build.properties
#———————————————————
# build5.properties
#———————————————————
project.name=${ant.project.name}
project.version=1.0
main.class=helloAnt.HelloAnt
jars.name=${ant.project.name}.jar
src.dir=../src
build.dir=../bin
classpath=../bin
user.name=Developer1
backup.dir=../backup
>>>>> build5.xml
<?xml version=”1.0″ encoding=”euc-kr” ?>
<project name=”helloAnt” default=”start.copy” basedir=”.”>
<property file=”./build.properties”/>
<target name=”compile”>
<javac srcdir= “${src.dir}”
destdir=”${build.dir}”
includes=”**/*.java”
excludes=”**/*.class”
classpath=”${classpath}”
/>
</target>
<target name=”create_manifest” depends=”compile”>
<manifest file=”${src.dir}/MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
<attribute name=”Main-Class” value=”${main.class}”/>
</manifest>
</target>
<target name=”jars” depends=”create_manifest”>
<!– ./helloAnt2.jar –>
<jar destfile=”${basedir}/${jars.name}”
basedir=”${build.dir}”
includes=”**/*.class”
excludes=”**/*.java”
compress=”true”
index=”true”
manifest=”${src.dir}/MANIFEST.MF”>
<!–압축할 파일들–>
<fileset dir=”${build.dir}”/>
</jar>
</target>
<target name=”execute” depends=”jars”>
<!–./helloAnt2.jar–>
<java jar=”${basedir}/${jars.name}”
fork=”true”
failonerror=”true”
maxmemory=”128m”
/>
</target>
<target name=”start.copy” depends=”execute”>
<!–폴더를 생성합니다.–>
<mkdir dir=”${backup.dir}”/>
<!–기본 디렉토리에 생성된 jar파일을 backup 폴더로 복사합니다.–>
<copy file=”${basedir}/${jars.name}” todir=”${backup.dir}” overwrite=”true”/>
<!–기본 디렉토리에 생성된 jar파일을 삭제합니다.–>
<delete file=”${basedir}/${jars.name}”/>
</target>
</project>
직접 사용한 예제;
<?xml version=”1.0″ encoding=”euc-kr” ?>
<!–default: 처음 시작 target 지정–>
<project name=”mytest” default=”compile” basedir=”.”>
<!–소스 디렉토리–>
<property name=”src.dir” value=”../src”/>
<!–컴파일 되서 class로 변환되어 들어갈 경로–>
<property name=”build.dir” value=”../bin”/>
<!–컴파일시 참조할 경로–>
<property name=”classpath” value=”../bin”/>
<target name=”compile” depends=”start.copy”>
<javac srcdir= “${src.dir}”
destdir=”${build.dir}”
includes=”**/*.java”
excludes=”**/*.class”
classpath=”${classpath}:../lib/jvftplib.jar:../lib/ojdbc14.jar”
/>
</target>
<target name=”start.copy” >
<!–BIN 디렉토리 생성.–>
<mkdir dir=”${build.dir}” />
<!–src 의 xml 리소스 파일 복사.–>
<copy todir=”${build.dir}/com/juice/onm/xml/resource”
overwrite=”true”
includeEmptyDirs=”true”
flatten=”false”>
<fileset dir=”../src/com/juice/onm/xml/resource” />
</copy>
</target>
</project>
실행
java -jar xxxxxx.jar