'ant'에 해당되는 글 2건

  1. 2007.12.19 ant----- jar 만들기
  2. 2007.12.19 ant
Etc2007.12.19 14:41
 
[ant]JAR 테스크 소개


[ant]JAR 테스크 소개

프로젝트 개발시 필요한 것들을 JAR 파일로 묶을 경우가 있는데 … 이때 사용하는 TASK가 JAR 테스크 입니다.

JAR 파일이란 정보를 담고 있는 manifest 파일과 실제 자바 애플리케이션으로 구성되어 있는데 JAR에 관한 자세한 사항은 다음 강좌를 참고하시기 바랍니다.

http://oraclejava.co.kr/zboard/view.php?id=LecJava&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=jar%20cvf&select_arrange=headnum&desc=asc&no=5

아래 예제는 test.jar 파일로 ${build}/classes 폴더 아래의 클래스를 묶는 예 인데 testproject/test 이하의 클래스만 포함하고 Test.class는 제외하는 예제 입니다.

참고로 ${dist}, ${build}는 속성값으로 이전에 어떤 디렉토리 라고 정의를 합니다.

<jar destfile=”${dist}/lib/test.jar”
    basedir=”${build}/classes”
    includes=”testproject/test/**”
    excludes=”**/Test.class”
/>

위에서 destfile은 생성될 JAR 파일을 의미하며 basedir은 jar로 압축될 파일이 있는 폴더입니다.


이번에는 fileset을 이용하여 Test.class를 제외한 파일을 JAR로 묶는 예입니다.

<jar destfile=”${dist}/lib/test.jar”>
    <fileset dir=”${build}/classes”
            excludes=”**/Test.class”/>        
    <fileset dir=”${src}/resources/>
</jar>
Posted by is윤군
TAG ant

댓글을 달아 주세요

Etc2007.12.19 14:21

ant

holymana.com Documents

GwonSungHyun, holymana@hanmail.net

2003, March - ver 1.0

All rights reserved Copyleft©2003

 

How to use Ant

Ant 의 사용용례와 사용법

 

Table Contents

1. Ant 란 무엇인가?

1-1. Ant 한번 해보기로 한 이유

1-2. Ant 프로젝트

1-3. Ant 어디에 쓰는 물건이고?

    

     2. 일단 돌려보자

           2-1. Ant 다운로드

           2-2. Ant 설치

           2-3. Ant 준비

2-4. Ant 빌드파일 만들기

2-5. Ant 실행

 

     3. Ant 파헤치기

           3-1. build.xml 내용 분석

           3-2. ant 실행 옵션 및 환경변수

 

     4. 클래스 패스 설정 및 기타

4-1. 프로젝트 환경 구성

4-2. build.xml 만들기

4-3. 특정 파일만을 위한 build.xml 만들기

    

     5. 부록 à 이게 핵심일 것 같음.. ㅡㅡ;

 

) 저는 국어선생님도 아니며 더군다나 국어를 지키고 아껴야 하는 의무감으로 무장된 사람도 아닙니다.

전 단지 웹에서 나고 자란 사람이며 고등학교 국어 시간에 배운 언어의 자의성과 사회성을 믿는 사람이며,

언의의 역사성을 그 어느때보다 빠르게 절감하는 현대사회를 살아가는 사람일 뿐입니다.

그러므로 가끔 생활습관이 되어 버린 어구나 문법파괴가 보이더라도 양해를 부탁드립니다.



1. Ant 란 무엇인가?

1-1. Ant한번 해보기로 한 이유

웹을 보면 ant 이야기가 곧잘 나온다. 좋다고는 하는데 머가 좋은지.. 젠장!

이런 저런 핑계와 귀차니즘으로 인하여 또 이바닥에서 한걸음 뒤쳐지나 보다 하는 답답한 가슴만 쓸어 내릴뿐..

(물론 이런상황을 연출하는 것은 ant뿐만이 아니지만.. ㅡㅡ;)

빌더 도구라는데 도대체 얼마나 편리하다길래.. 그런 생각의 반복뿐..

개인적으로 자그마한 framework를 하나 만들려고 쪼물딱 거리다, 컴팔하는게 귀찮아서 투덜거리는데 문득

빌더 도구 ant가 생각나 이번기회에 이넘 한넘만 먼저 패고 가자란 생각으로 웹을 뒤적거렸다.

사실 맘 잡고 한넘 패기가 힘든 이유가 한넘 패고 있음 이넘저넘이 나타나 다 공부해야 한다는 압박 때문에

너무 힘들어..  정말 이번만은 옆에서 태클을 걸어와도 이넘 한넘만 패자고 독하게 다짐했다.

 

Ant 가 어떤넘인지? 이것가지고 무엇을 하자 는건지?

그리고 함만 돌려보기를 목적으로 예상기간을 5일로 잡고 시작했다.

 

그러나 결과는 단 4시간 만에 소기의 성과를 달성할수 있었으니……

사실 자카르타 서울 프로젝트에서 기웃거리기만 하고 아무런 해답을 찾지 못한것만 3시간 30분..

다른 곳에서 찾은 내용들을 참조하며 결국은 30분만에 상황이 종료 된것이다.

 

아무래두 양넘들의 사고 방식에 익숙하지 않은지 우리나라 교육의 문제였는지

그 어떤 내용도 회상컨데..

자카르타 가서 문서 아무리 보고 해도 필이 팍팍 꽂히는건 극히 드물었던 것 같다.

모든 해답은 공유의 정신으로 무장된 이바닥의 몇몇 선지자들이 유포한 찌다시들에 있었으니….

 

그래서 이문서 또한 나와 똑 같은 왕초보이며 나와 똑 같은 교육을 받고 이바닥에서 고군분투 하는 소수를 위해

제작하기로 한다. – 다수일지 소수일지 나도 모른다. 허접이인 나의 관점에서는 아무래두 소수일 것 같다.

 

1-2. Ant 프로젝트 ( http://ant.apache.org )

그래서 함 공부해보잔 마음으로..

http://jakarta.apache.org에 가서 ant를 찾아 보았더니.. 안보인다.

분명 여기서 보았는데.. 하면서

SubProject를 찾아 봐도 보이지가 않길래 혹시나 하고.. http://jakarta.apache.org/ant 라고 했더니..

http://ant.apache.org/ 로 포워딩 되며 또 하나의 거대한 사이트로 ant프로젝트가 나타난다.

“ant project가 머길래 이렇게 혼자 놀아?” 란 생각을 하는 순간…

 

On November 18, 2002, the Apache board created the Apache Ant top level project. Ant has now

migrated from the Jakarta project into an Apache project of its own. This is primarily an

organizational change and will not affect the technical aspects of the project. Ant retains a strong

association with the Apache Jakarta project. One effect of this change is that the Ant webpage is

now located at http://ant.apache.org/

 

라며……… 휘황찬란하게 뭔가를 설명하는 글귀가 대뜸 보였다.

대충 보면 조직개편등의 이유로 이사왔으며 아파치 자카르타와 잘 지내고 있다는 것 같은데 별이유 없는 것 같다.

 

1-3. Ant란 무엇인가?

     잡설이 길었다. 위의 내용은 보지 않아도 되는 부분이다.

       Ant프로젝트 사이트의 거창하고 복잡하고 무슨내용인지도 모를 그런 내용을 없애 버리고

“고기 낚는 법이 아닌 고기를 주기 위한 문서”를 지향 하도록 한다.

그러므로 Ant란 무엇인가 알필요도 없다. 일단은 컴팔 쉽게 하도록 하기 위해서 쓴다는것만 알아두고…

컴팔이 주는 귀차늠 압박이 솔솔한데 이넘이 참 쉽고 재미있게 해준다. 그래서 개미인 것 같다. 일단 해보자!

 

2-1. Ant다운로드

       http://ant.apache.org/bindownload.cgi 에서 apache-ant-1.5.2-bin.zip 다운로드 한다.

     

2-2. Ant설치

       설치는 다운로드 받은 파일의 압축을 풀고 환경만 설졍하면 된다.

다운로드 받은 파일을 C:\WebService\Ant\ 두기로 하였다.

 

위의 그림을 참고 하면 되고요.. 환경설정을 합니다.

 

JAVA_HOME = C:\jsdk141

ANT_HOME = C:\WebService\Ant

다음 bin을 Path에 잡는다.  PATH = %PATH%;C:\WebService\Ant\bin; 설치 .

 

출처 : http://jakarta.apache-korea.org/ant/manual/install.html#installing


2-3. Ant 준비

     1. 프로젝트 폴더를 하나 만들자. 소스파일이 위치할 src, 클래스파일이 위치할 classes, 배포파일이 위치할 jar, 마지

          막으로 문서파일이 위치할 docs 이렇게 4개의 폴더를 적당한 프로젝트 폴더 밑에 생성한다.

 

       2. 다음 src밑에 테스트할 적당한 java 프로그램을 만들어 둔다.

          다음은 test Hello.java . 특별한 이유없다. 긁어서 테스트 해보시라고ㅡㅡ;

       public class Hello {

        public static void main (String[] args) {

             System.out.println (“hello Ant!”);

}

    }

 

2-4. Ant 빌드파일 만들기

     1. Ant 실행하면 해당 디렉토리의 build.xml 기본적으로 찾는다. 물론 build.xml말고 mySetting.xml등등으로

       이름을 줄수도 있다. 이렇게 주고 나면 ant 실행시 –buildfile 이란 옵션으로 따로 호출해야 한다.

       정신 건강상 build.xml 실행 하고 옵션들에 대해서는 일단 해보고 정리를 한다.

       2. build.xml 컴팔 (빌드라고도 하는데…)하기 위한 옵션들이나 여러 환경들을 설정하는 곳이다.

          기존에 클래스 패스 잡고 하던걸.. 여기서 세팅한다고 생각하면 된다.

       3. 다음은 build.xml이다.

<?xml version="1.0"?>

 

<project name="HelloAnt" default="javadoc" basedir="." >

 

 

<property name="src.dir" value="${basedir}/src" />

<property name="classes.dir" value="${basedir}/classes" />

<property name="jar.dir" value="${basedir}/jar" />

<property name="javadoc.dir" value="${basedir}/doc" />

 

<target name="compile" >

   <javac srcdir="${src.dir}" destdir="${classes.dir}" />

</target>

<target name="jar" depends="compile">

   <jar jarfile="${jar.dir}/hello.jar" basedir="${classes.dir}" includes="**/*.class" />

</target>

<target name="javadoc" depends="compile, jar" >

   <javadoc sourcepath="${src.dir}" sourcefiles="${src.dir}/HelloAnt.java"

windowtitle="HelloAnt API" destdir="${javadoc.dir}" />

</target>

 

<target name="clean" >

<delete dir="${jar.dir}/jar/*"/>

<delete dir="${javadoc.dir}/doc/*"/>

</target>

 

</project>

       4. 위의 xml파일을 특별하게 고칠건 없다. 위의 내용들을 대충 보면 일식견만이라도 있는 개발자분들은 컴팔(빌드)

          하는데 필요한 기본적인 내용은 감각으로 알수 있을 같다. 일단 돌려보고 자세한 옵션을 보도록 하자.

       - 아무리 생각해도 눈으로 ~~! 되는구나!” 하고 결과를 보지 않고서는 머릿속의 의구심이 지식습득에

장애물이라는 지론을 가졌기에 일단 족쳐보고 파악하는 습관이.. ㅡㅡ; 그래서 수학문제 풀때도 답부터 보고

문제를 풀지 않았던가? ^^; 있게 보일라고 귀납적 증명이라는 말도 안되는 수식어를 가끔 애용한다.

 

2-5. Ant 실행

1. Commend 창에서 프로젝트 디렉토리에서 ant 라고 실행하면 된다.

실행 하면 위와 같이 컴팔하고 문서도 만들고 어쩌고 저쩌고 하면서 BUILD SUCCESSFUL 이라는 메시지가 보인다.

2. 그리고 프로젝트 폴더 밑에 가보면 각각의 폴더 밑에 컴팔이 완료된 클래스 파일, jar파일, java doc 들이 생겼을

것이다. 이것이 바로 ant 이다.

 

 

 


3. Ant 파헤치기

 

3-1. build.xml 내용 분석

 

<?xml version="1.0"?>

 

 <!—

    name : 프로젝트 이름 (아무꺼나 해도 됩니다.)

    default : the default target to use when no target is supplied. (필수) à 근데 잘 모르겠다.

            작업을 수행할 target name을 준다.

javadoc라로 target을 주었으므로 depends에 의해 compile하고 jar수행하고 javadoc까지

수행을 하지만 clean까지는 수행을 하지 않는다.

그러므로 컴팔만 하려면 default=”compile” 로 설정해주면 된다.

    basedir : 그냥 작업 디렉토리 굳이 위와 같이 build.xml이 parent폴더일때 basedir=”.” 이라고 해줄 필요 없다.

   

, project 태그는 이렇게 <project default="javadoc" > 사용할수 있다.

-à

 

<project name="HelloAnt" default="javadoc" basedir="." >

 

 <!—

    ${basedir} : 프로젝트의 절대 경로 (위에서 basedir을 설정안하면 현재 프로젝트의 절대 경로)

-à

<property name="src.dir" value="${basedir}/src" />

<property name="classes.dir" value="${basedir}/classes" />

<property name="jar.dir" value="${basedir}/jar" />

<property name="javadoc.dir" value="${basedir}/doc" />

 

<!—

     javac : 컴파일

     srcdir : 소스파일의 위치

     destdir : 컴팔된 클래스파일 위치

-à

<target name="compile" >

   <javac srcdir="${src.dir}" destdir="${classes.dir}" />

</target>

 

 <!—

     jar : jar 압축

     jarfile : jar파일이 생성될 경로와 jar파일 이름

     basedir : 컴파일된 파일들의 위치

     includes : 모든 폴더에서 클래스 파일만 jar생성

-à

<target name="jar" depends="compile">

   <jar jarfile="${jar.dir}/hello.jar" basedir="${classes.dir}" includes="**/*.class" />

</target>

 

<!—

     javadoc : javadoc 수행

     sourcepath : javadoc을 수행할 소스파일의 위치

     sourcefile : 파일이름

     windowtitle : 직접 해보시길… ^^;

     destdir : 문서가 저장될 경로

     ** depends : 의존성?  현재 타겟을 수행하기 전에 depends에 정의된 타겟을 차례대로 먼저 수행한다.

        즉 compile과 jar가 수행한후 javadoc를 수행한다.

-à

<target name="javadoc" depends="compile, jar" >

   <javadoc sourcepath="${src.dir}" sourcefiles="${src.dir}/HelloAnt.java"

windowtitle="HelloAnt API" destdir="${javadoc.dir}" />

</target>

 

<!—

     delete : 삭제

-à

<target name="clean" >

<delete dir="${jar.dir}/jar/*"/>

<delete dir="${javadoc.dir}/doc/*"/>

</target>

</project>

 

3-2. ant 실행 옵션 및 환경변수

       ant를 실행할 때 ant 만 해서 실행을 했다. 이제 ant를 실행할 때 유연하게 이용할수 있는 다양한 실행 옵션을 보자.

      


       Options

              -help : help 명령어

             -projecthelp : build.xml이 존재하는 디렉토리에서 실행

               

              -diagnostics : 해보면 압박 ㅡㅡ; 여러가지, 아니 아주 많은 정보들을 출력한다.

              -quit : 빌드 과정을 보여주지 않고 최종 결과만 출력

              -debug : 디버그 정보 출력

              -emacs : 잘 모르겠음 ㅡㅡ;

              -logfile : commend에 출력되는 빌딩 과정 정보를 파일로 기록    ex) ant logfile building.log

              -logger, -listener : 잘 모르겠음. 

자세한 내용은 요기로 --à http://ant.apache.org/manual/listeners.html

              -buildfile : build.xml을 사용하지 않고 다른 파일에서 빌드를 하고자 할 때

              -D : property 값을 인자로 사용할 때 à build.xml을 이용하여 다양하게 사용할수 있다.

              -propertyfile : 위의 D옵션들을 세트로 사용하기 위한 property파일을 이용할 때.

              -inputhandler : 잘 모르겠음!

자세한 내용은 요기로 --à http://ant.apache.org/manual/inputhandler.html

              -find : ex) ant find build.xml 이라고 하면.. 시스템 루트에서 쭈욱 훑으면서 build.xml을 찾아서 builiding한다.

              * 잘 모르겠음이라 된 부분은 실제로 사용용도와 사용법을 모르기에 위와 같이 기재 했다.

      

환경변수 (정확하게 사용방법을 모름)

       1. JAVACMD - full path of the Java executable.

Use this to invoke a different JVM than JAVA_HOME/bin/java(.exe). 다른 JVM 을 사용하고 할 때.

              2. ANT_OPTS -  command-line arguments that should be passed to the JVM.

For example, you can define system properties or set the maximum Java heap size here.

3. ANT_ARGS - Ant command-line arguments. For example, set ANT_ARGS to point to a different logger,

include a listener, and to include the -find flag. Note: If you include -find in ANT_ARGS, you should

include the name of the build file to find, even if the file is called build.xml.



4. 클래스 패스 설정 및 기타

 

4-1. 프로젝트 환경 구성

프로젝트 환경을 예제로 구성하기에는 많은 제약이 따르므로 다음의 환경을 참고 하여 각자에 알맞은 프로젝트 환경

에서 사용할수 있도록 한다.

Ant 테스트를 위한 프로젝트 환경을 다음과 같이 구성한다.

 

우선 wwwAnt 밑에서 프로젝트를 진행한다. 실질적으로 사용될 환경은 WEB-INF 폴더가 ant 의 기본작업 dir이다.

일반적인 웹 프로젝트의 모습을 하고 있으며 귀차니즘으로 인하여 그냥 완료된 프로젝트중에 하나를 가져온것이다.

테스트를 위하여 서블릿엔진은 고려하지 않고 필요한 모든 libarary를 WEB-INF\lib\ 밑에 두었다.

 지금 목적은 개발팀에서 개발한 WEB-INF\src\ 에 있는 모든 소스파일들을 컴팔하고 컴팔된 class파일들은

WEB-INF\classes\ 밑에 둘것이며 또한 배포 파일과 문서들을 생성할것이다.


4-2. build.xml 만들기

프로젝트에 대한 위와 같은 요구를 부합하기 위한 build.xml파일을 만들기로 한다.

다음은 위의 요구들을 수용하기 위한 build.xml 이다.

 

<?xml version="1.0"?>

 

<project name="InRealProjectTest" default="javadoc">

  

<property name="p_src.dir"       value="${basedir}/src"        />

<property name="p_classes.dir" value="${basedir}/classes"  />

<property name="p_jar.dir"        value="${basedir}/jar"         />

<property name="p_javadoc.dir" value="${basedir}/doc"       />

<property name="libRoot"          value="${basedir}/lib"                         />

<property name="tomcatRoot"    value="C:/WebService/Tomcat/common/lib"/>

 

<!—

    사용하는 패키지가 있는 클래스 경로 설정

-à

<path id="p_classPath">

     <pathelement path="${libRoot}/mm.mysql-2.0.14-bin.jar"/>

     <pathelement path="${libRoot}/junit.jar"                  />

     <pathelement path="${libRoot}/velocity-1.2.jar"        />

     <pathelement path="${libRoot}/velocity-dep-1.2.jar"  />

     <pathelement path="${tomcatRoot}/servlet.jar"              />

     <pathelement path="${tomcatRoot}/tools.jar"           />

     <pathelement path="${tomcatRoot}/activation.jar"           />

     <pathelement path="${tomcatRoot}/mail.jar"            />

</path>

 

<!—

    클래스 패스는 아래와 같이 위에서 설정한 경로들을 classpath의 refid값으로 설정만 하면 인식한다.

-à

<target name="compile" >

   <javac srcdir="${p_src.dir}" destdir="${p_classes.dir}">

           <classpath refid="p_classPath"/>

   </javac>

</target>

 

<target name="jar" depends="compile">

   <jar jarfile="${p_jar.dir}/webProject.jar" basedir="${p_classes.dir}" includes="**/*.class" />

</target>

 

<!—

    fileset 태그를 이용하여 문서화할 경로와 파일들을 설정할수 있다.

    *.java는 fileset의 루트에 해당하는 모든 Java파일을 문서화 하는것이며

    **은 그 아래의 모든 패키지내의 모든 파일을 문서화 한다는 것이다.

    Exclude는 문서화에서 제외할 것이다.

-à

<target name="javadoc" depends="compile, jar">

   <javadoc windowtitle="HelloAnt API" destdir="${p_javadoc.dir}">

    <classpath refid="p_classPath"/>

           <fileset dir="${p_src.dir}" defaultexcludes="yes">

                <include name="*.java"  />

                <include name="**" />

                <exclude name="*.xml" />

           </fileset>

     </javadoc>

 

</target>

 

</project>

 

이상과 같이 처음 목적에 부합되는 build.xml파일로 프로젝트 컴파일, 문서화, jar압축 파일을 완성하였다.

그런데 컴파일 할 때 개별적으로 특정파일에 대한 컴파일을 하는 일이 더 많다.

마지막으로 특정 파일에 대해서 선택적으로 컴파일을 할수 있는 build.xml을 작성하고 마치기로 한다.

 

4-3. 특정 파일만을 위한 build.xml 만들기

사용자가 호출하는 특정 파일만을 컴파일 하기 위한 build.xml이다.

위에서 만들어진 build.xml에서 추가하여 작업 하기로 한다.

 

<?xml version="1.0"?>

 

<project name="InRealProjectTest" default="javadoc">

 

 

<property name="p_src.dir"         value="${basedir}/src"         />

<property name="p_classes.dir"  value="${basedir}/classes"  />

<property name="p_jar.dir"          value="${basedir}/jar"          />

<property name="p_javadoc.dir"   value="${basedir}/doc"        />

<property name="libRoot"            value="${basedir}/lib"                              />

<property name="tomcatRoot"      value="C:/WebService/Tomcat/common/lib"/>

 

<path id="p_classPath">

       <pathelement path="${libRoot}/mm.mysql-2.0.14-bin.jar"/>

       <pathelement path="${libRoot}/junit.jar"                          />

       <pathelement path="${libRoot}/velocity-1.2.jar"        />

       <pathelement path="${libRoot}/velocity-dep-1.2.jar"  />

       <pathelement path="${tomcatRoot}/servlet.jar"                />

       <pathelement path="${tomcatRoot}/tools.jar"                  />

       <pathelement path="${tomcatRoot}/activation.jar"            />

       <pathelement path="${tomcatRoot}/mail.jar"                   />

</path>

 

<target name="makeClass">

     <javac srcdir="${p_src.dir}" destdir="${p_classes.dir}" includes="**/${file}">

           <classpath refid="p_classPath"/>

     </javac>

</target>

 

<target name="compile" >

   <javac srcdir="${p_src.dir}" destdir="${p_classes.dir}">

              <classpath refid="p_classPath"/>

   </javac>

</target>

 

<target name="jar" depends="compile">

   <jar jarfile="${p_jar.dir}/webProject.jar" basedir="${p_classes.dir}" includes="**/*.class" />

</target>

 

<target name="javadoc" depends="compile, jar">

   <javadoc windowtitle="HelloAnt API" destdir="${p_javadoc.dir}">

    <classpath refid="p_classPath"/>

              <fileset dir="${p_src.dir}" defaultexcludes="yes">

                    <include name="*.java" />

                    <include name="**"      />

                    <exclude name="*.xml"       />

              </fileset>

       </javadoc>

 

</target>

 

</project>

 

위의 build.xml에서 진하게 표시된 부분이 특정한 파일만을 컴파일 하기 위해 추가된 부분이다.

기존의 컴파일을 위한 target과 다를게 없다.

단지 추가 된 것은 includes="**/${file} 이다.

 

사용방법은 ant 실행시 다음과 같이 옵션을 주는것이다.

ant –Dfile=TypeFactory.java makeClass

ant [option] [target] 인 것이다.

 

4-4. 마치며

     이상과 같이 ant의 사용법을 살펴 보았다.

       설명이 부족한점도 있기도 하지만 처음 사용법이 복잡해 보인다.

       위의 문서는 ant의 사용법이 아니라 ant를 쉽게 접근 하기 위해 제작된 문서이며 1시간만 투자해서 위와 같은

       기본적인 것들만 수행해본다면 ant를 활용하여 더욱더 다양한 방법으로 접근 할수 있을 것 같다.

       위와 같은 build.xml만으로도 충분히 원하는 작업을 할수 있겠지만.

       Ant에서 Java명령어 실행, 파일 copy등 더 다양한 작업을 수행할수 있고 ant자체 만으로 잘 만들어지 app를 이용

       하여 자신만의 간단한 개발툴이나 방법론 까지 확장할수 있을것이다.

 


부록

출처 http://www.javastudy.co.kr/docs/lec_ant/antInstall.txt

다 작성하고 보니 더 좋은 문서가 있어서… ㅡㅡ;

삽질 한거 같은 기분이 들어서 부끄럽지만.. 그래도 위의 설명을 실행해보고 아래의 잘 정리된 옵션을 보면…

광명이… ^^

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:\weblogic\lib\weblogicaux.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

3. http://www.javastudy.co.kr
 
첨부파일의 압축을 푸시면 완벽한 HTML형식의 파일로 출력할수 있습니다.
또한 다시 DOC파일로 변환이 가능합니다.
필요하신 분은 HTML을 게시하시거나, DOC문서로 배포하여 사용하셔도 됩니다.. ^^;
Posted by is윤군
TAG ant

댓글을 달아 주세요