sitelink1 | http://www.javastudy.co.kr/docs/lec_ant/antInstall.txt |
---|---|
sitelink2 | |
sitelink3 |
Apache ANT Guide
요약 : Apache ANT Guide
작성자 : 최지웅
Article요약
아파치 그룹에서 내놓은 빌더툴인 ant1.4.1버젼을 이용하여 각각의 태그와 그에 대한 내용을
공부해보도록 하죠.. *^^*
이툴을 이용하여 java compile및 ejb-jar파일의 생성, deploy및 sql파일의 처리, database에 대한
접속을 통하여 많은 일들을 할수 있도록 구성되어져 있습니다.
각 사용법과 샘플을 통하여 사용법을 익혀보도록 합시다
Article 내용
****************************
* Ant 시작하기 *
****************************
.인스톨하기
- 아래의 사이트로부터 다운받는다.
http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/
- 권장사항 jdk1.2버젼이상을 추천한다.
- Windows
설치된 디렉토리가 c:ant. 로 가정했을경우에
set ANT_HOME=c:ant
set JAVA_HOME=c:jdk1.3.1
set PATH=%PATH%;%ANT_HOME%bin
의 환경변수를 잡아주도록 한다.
- Unix(bash)
export ANT_HOME=/usr/local/ant
export JAVA_HOME=/usr/local/jdk1.3.1
export PATH=${PATH}:${ANT_HOME}/bin
****************************
* Ant 실행하기 *
****************************
Command-line option
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp 프로젝트에 필요한 도움을 보여준다
-version 현재 버젼은 보여준다
-quiet 아무런 표시없이 build한다
-verbose verbose모드를 실시한다.
-debug dubugging을 한다.
-emacs 로깅정보를 만들어낸다
-logfile file 주어진 파일로 로그를 출력한다.
-logger classname 해당클래스를 이용하여 로깅을 수행한다.
-listener classname 리스너클래스를 추가한다.
-buildfile file 대상 build파일을 정의한다.
-find file 루트로부터 buildfile을 찾는다.
-Dproperty=value build설정에 필요한 프로퍼티를 찾는다.
ant를 batch파일 없이 직접 실행하고 싶다면 아래와 같은 옵션을 이용하여 실행하면 된다
java -Dant.home=c:ant org.apache.tools.ant.Main [options] [target]
*************************************
* SimpleBuild파일 만들어보기 *
*************************************
상위 tag부터 소개한다.
<project name="" default="" basedir=""></project>
name -- 이 프로젝트의 설정이름을 기록한다.( 안써두 무방 )
default -- target이 지정되지 않았을때 default target으로 쓴다. (반드시 기술)
basedir -- 현재 build를 사용할 디렉토리를 설정한다. 보통 현재디렉토리를 많이 사용한다.(안써두 됨)
================================================================
<target></target>
현재 build되는 target은 다른 target에 의존하여 build되어질수 있다. 그럴경우에 이 tag를 이용하여
build하도록 한다.
<target name="A"/> -- 현재 build되어진다.
<target name="B" depends="A"/> -- A가 정상적으로 이루어져야만 B의 build가 이루어진다.
<target name="C" depends="B"/> -- 위와 같은 방법으로 recursive하게 이루어진다.
<target name="D" depends="C,B,A"/>
이해가 금방 되리라 본다.
여기서 조합으로 if-unless를 사용할수도 있다.
1: <target name="build-module-A" if="module-A-present"/>
2: <target name="build-own-fake-module-A" unless="module-A-present"/>
위의 내용에서 module-A-present에 따라서 두가지 형태로 분기되면 반드시 한가지는 실행되어지는
모습을 볼수 있다. module-A-present가 성공했을경우 1번을 수행하고, 실패했을경우는 2번으로
분기되어서 실행될수 있도록 한다.
target은 다음과 같은 속성을 갖는다.
name -- target의 이름.(반드시 기술하여야 함)
depends -- 콤마(,)로 구분하며 다른 target에 영향을 받으며 build되어진다.(안써두 됨)
if -- 현재 target이 실행될것인지를 결정(안써두 됨)
unless -- unless의 target이 실패했을경우 처리되는 부분(안써두 됨)
description -- description(안써두 됨)
*************************************
* Properties의 사용 *
*************************************
<property name="foo.dist" value="dist"/>
dist란 value를 foo.dist로 setting한다.
<property file="foo.properties"/>
foo.properties파일을 읽어들여 build.xml파일의 프로퍼티로 세팅한다.
<property resource="foo.properties"/>
<property file="${user.home}/.ant-global.properties"/>
속성을 겹쳐서 프로퍼티 파일을 읽어들일수도 있다.
*************************************
* Path-Link의 사용 *
*************************************
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
클래스패스링크를 사용하여 path 또는 classpath를 추가시킬수 있다.
패스를 계속적으로 추가하고자 할때는 ; or :를 이용하여 추가할수 있다.
위의 내용을 아래와 같이 요약하여 한줄에 추가시킬수 있다.
<classpath path="${classpath}"/>
*************************************
* Referencing하기 *
*************************************
<project ... >
<target ... >
<rmic ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</rmic>
</target>
<!-- =====위의 내용은 rmic를 이용하여 클래스패스를 이용한 컴파일을 시도하기 위한 스크립트이다 -->
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
<!-- =====위의 내용은 javac를 이용하여 클래스패스를 이용한 컴파일을 시도하기 위한 스크립트이다 -->
</project>
위의 샘플에서는 불필요한 classpath가 계속 쓰여지고 있다. 안좋은 방법이므로 아래와같이 다시 쓸수 있다.
<project ... >
<path id="project.class.path"> <----- path-id를 지정해놓고서 아래쪽에서 패스를 참조하도록 한다.
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/> <--- 위의 ref-id로 설정해 놓은 패스를 참조하여 사용하도록 한다.
</rmic>
</target>
<target ... >
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
*************************************
* Sample예제 *
*************************************
--현재 디렉토리 구성을 보도록 하자.
WeblogicBuildTest/
WeblogicBuildTest/src
WeblogicBuildTest/src/Echo.java
WeblogicBuildTest/src/EchoHome.java
WeblogicBuildTest/src/EchoEJB.java
WeblogicBuildTest/src/EchoClient.java
--아래의 내용을 이용하여 weblogicaux.jar를 이용하여 build를 시도한다.
-- 컴파일에 성공하면 현재 클래스파일들을 이용하여 MyProject-현재날짜.jar파일로 묶는다
도스명령 : ant -Dweblogic.classpath=c:weblogiclibweblogicaux.jar
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<property name="weblogicaux.jar" value="${weblogic.home}/lib/weblogicaux.jar" />
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"
classpath="${weblogic.classpath}:${build}"
/>
</target>
<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
==================================================
==================================================
Directory Base Tasks
==================================================
==================================================
1. Patterns
exclusion과 inclusion에 대한 패턴을 정의 할수 있으며, 우리가 일반적으로 사용하는
wild card *, ?를 이용하여 표현할 수 있다.
예를 들면
*.java 는 .java의 확장자를 가진 모든 파일을 표현한다.
x.java, FooBar.java 등등
*는 파일에 대한 내용을 보여주고자 할때 사용하는 패턴이며
**는 디렉토리의 이름을 이용하여 표현할수 있게끔 만드는 확장자 이름이다.
또한 0개 이상의 디렉토리를 표현하고자 할때 이패턴을 사용하게 된다.
예를 들어 /test/**는 test라는 디렉토리 안의 파일 및 다른 서브디렉토리를 모두 포함하는 wildcard로서 동작된다.
Example Pattern
**/CVS/* :
CVS/Repository
org/apache/CVS/Entries
org/apache/jakarta/tools/ant/CVS/Entries
But not:
org/apache/CVS/foo/bar/Entries (foo/bar/ 부분이 일치하지 않는다.)
--------------------------------------------
org/apache/jakarta/** :
org/apache/jakarta/tools/ant/docs/index.html
org/apache/jakarta/test.xml
But not:
org/apache/xyz.java
--------------------------------------------
org/apache/**/CVS/* :
org/apache/CVS/Entries
org/apache/jakarta/tools/ant/CVS/Entries
But not:
org/apache/CVS/foo/bar/Entries
---------------------------------------------
예제
<copy todir="${dist}">
<fileset dir="${src}"
includes="**/images/*"
excludes="**/*.gif"
/>
</copy>
src의 하위 디렉토리에서 **/images/* 패턴에 적용되는 것을 모두 복사하여 dist디렉토리로
복사한다. (현재 디렉토리에 있는 모든 *.gif인 파일은 제외하구 옮긴다.
*************************************
* FileCopy하기 *
*************************************
새로운 Fileset이나 file을 이용하여 파일/디렉토리로 카피할수 있다.
Paramters :
file -- 카피할 파일을 지정한다. 하나 또는 하나이상의 file or fileset을 지정해야 한다.
preservelastmodified -- 원본파일과 같을 경우 카피를 시도한다. 최종 수정본과 현재 대상본이 같아야 한다.(default : no)
tofile -- 카피되어질 파일이름을 지정한다. tofile or todir이 사용되어진다. fileset을 사용하게 된다면 todir로만 사용되어져야 한다.
todir -- 카피되어질 디렉토리를 설정한다
overwrite -- 대상디렉토리에 해당 파일이 존재할경우 overwrite할지 새롭게 만들지를 결정한다. Defaults to "no".
filtering -- 카피도중에 필터를 사용하여 카피를 할것인지를 결정한다. Defaults to "no".
flatten -- 소스디렉토리의 하위구조를 무시하고 모든 내용을 한디렉토리로만 복사한다. Defaults to "no".
includeEmptyDirs -- FileSet에 포함된 빈 디렉토리도 카피할수 있도록 한다. Defaults to "yes".
Examples
------------------------------------------------
1개의 파일 복사하기
<copy file="myfile.txt" tofile="mycopy.txt"/>
파일을 디렉토리로 복사하기
<copy file="myfile.txt" todir="../some/dir/tree"/>
한디렉토리를 다른 디렉토리로 복사하기
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
src_dir밑의 .java파일을 제외한 것을 ../dest/dir디렉토리로 복사
<copy todir="../dest/dir" >
<fileset dir="src_dir" >
<exclude name="**/*.java"/>
</fileset>
</copy>
<copy todir="../dest/dir" >
<fileset dir="src_dir" excludes="**/*.java"/>
</copy>
디렉토리에 있는 파일들을 대상으로 확장자 bak를 붙여서 복사하도록 한다.
<copy todir="../backup/dir" >
<fileset dir="src_dir" />
<mapper type="glob" from="*" to="*.bak"/>
</copy>
원본 디렉토리의 TITLE이라는 문자를 Foo Bar로 대치하여 복사한다.
<copy todir="../backup/dir" >
<fileset dir="src_dir" />
<filterset>
<filter token="TITLE" value="Foo Bar" />
</filterset>
</copy>
유사 태그로서 copydir, copyfile태그가 있다.
*************************************
* Delete하기 *
*************************************
하나의 파일을 지우거나, 서브디렉토리 및 하나이상의 fileset등을 이용하여 지울수
있도록 한다.
Parameter는 CopyFile과 유사하다. 추가가 된것을 보도록 하자.
failonerror -- 파일 삭제에 실패했을 경우, build를 멈추고 현재의 스크린에 해당 사항을 보여주도록 한다.
includeEmptyDirs -- 빈디렉토리까지 모두 삭제하도록 한다.
Examples
<delete file="/lib/ant.jar"/>
/lib/ant.jar 을 삭제한다.
<delete dir="lib"/>
lib디렉토리의 모든 파일 및 서브디렉토리를 가차없이 삭제한다.
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
현재 디렉토리및 하위디렉토리에서 bak의 확장자를 가진 파일을 모두 삭제한다.
<delete includeEmptyDirs="true" >
<fileset dir="build" />
</delete>
build자신을 포함하고 있는 디렉토리이면 모든 파일과 하위디렉토리를 삭제하도록 한다.
*************************************
* Echo *
*************************************
현재 시스템 콘솔이나 파일로 메시지를 출력하도록 한다.
message -- 보여줄 메시지를 기술한다.
file -- 이 메시지를 해당파일로 출력하도록 한다.(default no)
append -- 현재 파일이 존재하고있으면 추가시키는 모드를 설정한다.
Examples
<echo message="Hello world"/>
<echo>
요부분은 해당 콘솔에 나오는 글자입니다.!!! 바보야~~ ㅋㅋ
</echo>
*************************************
* JAR파일 만들기 *
*************************************
해당 task를 이용하여 jar파일을 생성할수도 있다.
ZIP파일을 묶는 task과 같은 형식으로 동작하여 각각의 묶일 파일이나 디렉토리 모두를 지정할수 있다.
<jar> </jar>tag에 반드시 들어가야하는 속성은 jarfile이란 태그로서 해당 jar파일의 이름을 지칭한다.
jarfile -- 생성할 jar-file
basedir -- jar-file을 생성할 기본디렉토리를 지정. Default No
compress -- 저장된 데이터뿐만 아니라 압축된 형태까지 모두 묶는다, No
encoding -- 묶을 파일의 character encoding set을 지정한다.웬만하면 바꾸지 말기
filesonly -- 엔트리에 들어있는 파일만 묶는다. No
includes -- ,(comma)로 분리되어 있는 패턴파일 리스트를 반드시 포함하여 묶는다. No
includesfile -- 각각에 패턴에 해당하는 파일을 이용하여 묶도록 한다. No
excludes -- 파일패턴에 대한 파일 제외하고 묶는다. No
excludesfile -- No
defaultexcludes -- defaultexclude를 사용할지 안할지를 결정한다. No
manifest -- manifest파일을 사용하도록 한다. No
update -- 만약에 해당 jar파일이 존재한다면 update할것인지 overwrite할것인지를 결정한다. No
whenempty -- 패턴에 매핑되는 파일이 없더라도 동작을 할것인지를 결정한다. No
Examples :
<jar jarfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
${build}/classes디렉토리에 있는 모든 파일들을 ${dist}/lib 디렉토리의 app.jar란 이름으로 압축한다.
-----------------------------------------------------------
<jar jarfile="${dist}/lib/app.jar"
basedir="${build}/classes"
excludes="**/Test.class"
/>
${build}/classes디렉토리의 Test.class를 제외한 모든 파일들을 ${dist}/lib디렉토의 app.jar파일의 이름으로 압축한다.
------------------------------------------------------------
<jar jarfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
${build}/classes디렉토리에 있는 모든 파일들을 ${dist}/lib 디렉토리의 app.jar란 이름으로 묶는다.
다 묶는것이아니라 ${build}/classes/mypackage/test밑의 파일만을 사용하며 Test.class를 제외한다.
<jar jarfile="${dist}/lib/app.jar">
<fileset dir="${build}/classes"
excludes="**/Test.class"
/>
<fileset dir="${src}/resources"/>
</jar>
${build}/classes와 ${src}/resource디렉토리를 app.jar라는 이름으로 함께 묶는데 Test.class를 제외하여 묶는다
--------------------------------------------------------------------------------
*************************************
* Java Execute *
*************************************
이제 tag를 이용한 java명령을 실행시켜보도록 하자.
우선 해당 tag안에 들어가는 parameter부터 확인해 보도록 하자.
한가지 조심해야 할것이 있는데 프로그램코딩중에 System.exit()부분을 잘 써야 한다
만약 그것을 써버리게 되면 ant또한 같은 vm상에서 동작중이므로 ant까지 빠져나와버리는
경우가 발생할수 있다.
classname -- 실행시킬 자바 클래스명을 기술한다. jar또는 class name이 될수 있다.
jar -- 실행시킬 jar파일의 위치를 표시한다.만약 이 옵션이 선택되어 진다면 반드시 Fork의 속성을 true로 만들어야 한다.
args -- 실행되어질 클래스의 argument를 지정한다. deprecate되었으면 현재는 <arg>태그를 사용한다. No
classpath -- 사용할 클래스패스를 지정한다. No
classpathref -- 클래스패스를 사용하는데 PATH에 정의되어진 reference를 이용한다. No
fork -- 다른 vm상에서 클래스를 trigger하고 싶다면 설정한다. No
jvm -- JVM에 대한 option command를 사용한다. fork옵션이 비활성화 되었으면 무시된다. No
jvmargs -- fork된 VM에 대한 argument를 사용한다. deprecated됐으며 <jvmarg> 를 사용한다. No
maxmemory -- fork된 vm에 대한 최대 메로리값을 할당한다. No
failonerror -- 0이 아닌 다른 returncode가 오게 되면 build process를 중지한다. 반드시 fork가 true일때만 사용가능하다. No
dir -- The directory to invoke the VM in. No
output -- 지정된 파일을 output으로 사용한다. No
Example
<java classname="test.Main" >
<arg value="-h"/>
<classpath>
<pathelement location="test.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
</java>
Examples
<java classname="test.Main"/>
<java classname="test.Main" fork="yes" >
<sysproperty key="DEBUG" value="true"/>
<arg value="-h"/>
<jvmarg value="-Xrunhprof:cpu=samples,file=log.txt,depth=3"/>
</java>
*************************************
* Java Compile *
*************************************
javac를 이용하여 자바프로그램을 컴파일할 수 있도록 하는 태그로서 각종 옵션들이 이쪽에 들어가게 된다.
Parameters
====================
srcdir -- 컴파일대상의 자바파일들의 위치를 나타낸다.
destdir -- compile된 클래스 파일들이 들어가게될 디렉토리를 지칭한다. No
includes -- ,(comma)로 분리된 파일의 패턴을 이용하여 포함된 파일들을 모두 컴파일한다. No
includesfile -- include패턴에 명명된 파일을 포함하여 compile한다. No
excludes -- exclude패턴에 명명된 제외을 포함하여 모두 compile한다. No
excludesfile -- exclude패턴에 명명된 제외을 포함하여 compile한다. No
defaultexcludes -- default excludes를 사용하여 compile한다. No
classpath -- 클래스 패스를 사용할 경우에 기술한다. No
bootclasspath -- bootstrap class file의 위치를 기술한다. No
classpathref -- PATH reference에 주어진 클래스패스를 사용하여 compile한다. No
bootclasspathref -- PATH reference에 주어진 bootstrap 클래스패스를 사용하여 compile한다. No
extdirs -- 설치된 extension의 위치. No
encoding -- source file encoding. No
nowarn -- compiler로 -nowarn옵션을 전달한다. No
debug -- compile time debug모드로 설정한다 No
optimize -- optimize옵션을 사용한다. no
deprecation -- deprecation옵션을 사용한다. No
target -- 명시된 VM을 사용하여 class파일을 생성하도록 한다. No
verbose -- 출력을 verbose모드로 설정한다. No
depend -- dependenty-tracking compiler모드를 사용한다. No
includeAntRuntime -- Ant run-time lib를 포함하여 compile한다. default = yes, required No
includeJavaRuntime -- 실행되는 VM으로부터 run-time lib를 포함하여 컴파일한다. defaults to no. Required No
fork -- 외부의 JDK compiler를 사용하여 javac를 수행한다. defaults to no. required No
memoryInitialSize -- VM상의 초기 메모리 사이즈를 설정한다. (examples: 83886080, 81920k, or 80m) , required No
memoryMaximumSize -- VM상의 최대 메모리 사이즈를 정한다. externally javac일 경우 사용되면 다른경우는 무시된다.
(examples: 83886080, 81920k, or 80m) No
failonerror -- 컴파일 에러가 발생했을 경우 계속 컴파일을 시도할것인지를 결정. defaults to true. required No
source -- command line switch로 -source를 사용한다. No
Examples
<javac srcdir="${src}"
destdir="${build}"
classpath="xyz.jar"
debug="on"
/>
${src} directory에 있는 모든 .java파일을 xyz.jar를 이용하여 compile한후 debug 정보는 연 상황에서 build디렉토리에
class파일들을 위치시킨다.
-------------------------------------------------------------------------
<javac srcdir="${src}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"
debug="on"
/>
${src} directory의 파일들을 컴파일하는데 조건은 xyz.jar를 클래스패스로 이용하고, mypackage/p1/**,mypackage/p2/**패턴을
따르는 소스(.java)를 포함하고, mypackage/p1/testpackage/**는 컴파일 대상에서 제외된다.
<javac srcdir="${src}:${src2}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"
debug="on"
/>
2개의 source path를 사용하여 compile하도록 한다. 나머지 방법은 위의 방법과 동일하다.
위의 방법은 아래와 같이 재구성되어질수 있다.
<javac destdir="${build}"
classpath="xyz.jar"
debug="on">
<src path="${src}"/>
<src path="${src2}"/>
<include name="mypackage/p1/**"/>
<include name="mypackage/p2/**"/>
<exclude name="mypackage/p1/testpackage/**"/>
</javac>
References
1. http://ant.apache.org
2. http://jakarta.apache-korea.org
3. http://www.javastudy.co.kr
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
12 |
Ant 로 Java Application 실행시 Target 에 파라미터를 입력하여 Arguments 로 전달하여 실행시키기
![]() | 황제낙엽 | 2012.06.05 | 2226 |
11 | ANT에서 Classpath 설정시 순서 주의 | 황제낙엽 | 2010.07.10 | 451 |
10 | Ant에서 "${java.class.path}"이 의미하는바 | 황제낙엽 | 2010.07.10 | 120 |
9 | ANT 를 이용한 RMI 컴파일 ( rmic 로 stub 생성하기 ) | 황제낙엽 | 2010.05.26 | 114 |
8 | Jakarta Ant II탄 상세편 | 황제낙엽 | 2007.01.24 | 113 |
7 | Jakarta Ant I탄 기본편 | 황제낙엽 | 2007.01.24 | 76 |
6 | 1900개가 넘는 java컴파일시 Ant의 설정 | 황제낙엽 | 2007.02.28 | 898 |
» |
Ant 의 사용 용례와 사용법
![]() | 황제낙엽 | 2007.07.16 | 91 |
4 | Ant로 UTF-8 엔코딩하기 (프로젝트 변환) | 황제낙엽 | 2007.07.03 | 168 |
3 |
ANT 작성예제 (build.xml , build.properties)
![]() | 황제낙엽 | 2007.05.16 | 104 |
2 | Eclipse에서 Ant+xdoclet 를 이용한 web.xml, struts-config.xml 자동생성 | 황제낙엽 | 2007.03.03 | 219 |
1 | Eclipse 의 auto compile 과 ANT의 compile | 황제낙엽 | 2007.02.28 | 347 |