반응형
src 디렉터리에 package 가 aaa.bbb.ccc의 형태로 되어 있을 때....

       <target name="compile">

             <mkdir dir="${build}"/>

             <javac destdir="${build}">

                    <src path="${src}"/>

                    <include name="**/*.java"/>

             </javac>

             <copy todir="${build}/aaa/bbb/ccc">

                    <fileset dir="${src}/aaa/bbb/ccc">

                           <include name="*.xml"/>

                           <include name="*.jsp"/>

                    </fileset>

             </copy>

       </target>

컴파일(javac)의 경우에는 destdir에 하위 폴더를 지정해주지 않아도 자동 생성된다.
그러나 copy의 경우에는 하위폴더를 지정해주지 않는다면
(만약 copy todir="${build}" 라고만 한다면 build 디렉터리에 카피될 것이다.

반응형
<< 참고사이트 >>
Apache Ant 1.7.0 Manual : http://ant.apache.org/manual/

Ant 기본구조 및 태스크는 아래 블로그를 참조하자.
잘 정리되어 있는 듯...

Ant 자바 빌드 툴 I : 기본 구조 : http://blog.naver.com/thdusin/100005914122
Ant 자바 빌드 툴 II : 태스크 : http://blog.naver.com/thdusin/100005926620

더 자세한 task를 알고 싶다면 apache 사이트를 참조하자.
Overview of Ant Tasks : http://ant.apache.org/manual/tasksoverview.html


build.xml 은 하나의 project 요소를 가진다.
project 요소는 target 요소를 포함하고, 각 target은 여러 task를 포함한다.
간단한 구조는 다음과 같다.

<project name="project_name" default="default" basedir=".">
      
<target name="compile" description="compile">

       <!--compile이라는 target name 대한 설명(description)-->

             ...

       </target>

      

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

       <!-- dist target compile 의존.
       compile target 실행 후에 dist target이 실행된다. -->

             ...

       </target>

 

       <target name="doc">

             ...

       </target>

</project>  



※ 예제 :

사용자 삽입 이미지
test1과 test2 패키지를 test1_2.jar 파일로 묶고,
test2와 test3 패키지를 묶어 test2_3.jar 파일로 묶는다.
javadoc 을 만들고,
lib폴더와 jar 파일들을 zip으로 묶는다.














<project name="ant" default="test1_2" basedir=".">

      

       <tstamp/>

       <!-- property -->

       <property name="src" location="src"/>

       <property name="build" location="build"/>

       <property name="lib" location="lib"/>

       <property name="dist" location="dist"/>

       <property name="doc" location="doc"/>

            

       <!-- compile -->

       <target name="compile" description="compile">

             <mkdir dir="${build}"/>

             <javac srcdir="${src}" destdir="${build}"

                classpath="${lib}/log4j-1.2.8.jar"/>

       </target>

      

       <!-- test1 test2 jar 묶는다 -->

       <target name="test1_2" depends="compile"

             description="test1 and test2 packaging">

             <mkdir dir="${dist}"/>

             <jar jarfile="${dist}/test1_2.${DSTAMP}.jar">

                    <fileset dir="${build}">

                           <exclude name="test3/*.*"/>

                    </fileset>

             </jar>

       </target>

      

       <!-- test2 test3 jar 묶는다 -->

       <target name="test2_3" depends="compile"

             description="test2 and test3 packaging">

             <mkdir dir="${dist}"/>

             <jar jarfile="${dist}/test2_3.${DSTAMP}.jar">

                    <fileset dir="${build}">

                           <exclude name="test1/*.*"/>

                    </fileset>

             </jar>

       </target>

      

       <!-- doc -->

       <target name="doc" depends="test1_2, test2_3">

             <mkdir dir="${doc}"/>

             <javadoc destdir="${doc}">

                    <fileset dir="${src}"/>

             </javadoc>

       </target>

      

       <!-- zip -->

       <target name="zip" depends="test1_2, test2_3">

             <copy todir="${dist}/lib">

                    <fileset dir="${lib}"/>

             </copy>

             <zip destfile="test_${DSTAMP}.zip">

                    <fileset dir="${dist}"/>

             </zip>

       </target>

      

       <!-- delete -->

       <target name="delete" depends="doc, zip">

             <delete dir="${build}"/>

       </target>

      

</project>


 
※ 설명 :
<!-- project -->
그냥 Run As 했을 경우, default 로 설정된 target이 실행된다.
default : Run as 시, 기본적으로 사용할 target name
basedir : base directory. 현재 디렉터리(.)이다.

<!-- property -->
property : 속성을 지정한다. 대소문자 구별.
<property name="src" location="src" />
src 라는 이름의 속성으로 경로(./src)를 지정한다.
다른 부분에서 이 속성을 참조하려면 "${src}" 라고 쓴다.
<javac srcdir="${src}" destdir="${build}" />
( value 와 location )
value : the value of the property.
location : Sets the property to the absolute filename of the given file. If the value of this attribute is an absolute path, it is left unchanged (with / and \ characters converted to the current platforms conventions). Otherwise it is taken as a path relative to the project's basedir and expanded.


<!-- compile -->
<mkdir dir="${build}"/>
build 라는 디렉터리를 만든다.
<javac srcdir="${src}" destdir="${build}" classpath="${lib}/log4j-1.2.8.jar"/>
src 디렉터리(하위 디렉터리 포함)의 java 파일을 컴파일해 build 디렉터리에 저장하고,
클래스패스에는 log4j-1.2.8.jar가 포함된다.

<!-- test1 test2 jar 묶는다 -->
<jar jarfile="${dist}/test1_2.${DSTAMP}.jar">
    <fileset dir="${build}">
         <exclude name="test3/*.*"/>
    </fileset>
</jar>

property 윗부분에 <tstamp/> 가 있다.
이는 DSTAMP, TSTAMP, TODAY 프로퍼티를 설정하는 것이다.
· DSTAMP : yyyyMMdd
· TSTAMP : hhmm
· TODAY  : MMM dd yyy
build 디렉터리에서 test3 패키지의 파일들을 제외(exclude)한 파일들을 jar로 묶어
dist 에 test1_2.날짜.jar 형태로 저장한다.
(ex. test1_2.20070802.jar)
fileset dir 하의 include, exclude는 여러 개 가능하다.

<!-- doc -->
<javadoc destdir="${doc}">
    <fileset dir="${src}"/>
</javadoc>

src 디렉터리의 파일들을 읽어 javadoc문서를 만들어 doc 디렉터리에 저장한다.

<!-- zip -->
<copy todir="${dist}/lib">
    <fileset dir="${lib}"/>
</copy>

lib 디렉터리를 dist/lib 에 복사한다.
<zip destfile="test_${DSTAMP}.zip">
    <fileset dir="${dist}"/>
</zip>

dist 디렉터리의 파일들을 zip으로 묶는다.
zip 파일이름은 test_날짜.zip  (ex. test_20070802.zip)

<!-- delete -->
<delete dir="${build}"/>
build 디렉터리를 삭제한다.


결과 :
Buildfile: C:\Users\kyh\workspace\ant\ant\build.xml

compile:

    [mkdir] Created dir: C:\Users\kyh\workspace\ant\ant\build

    [javac] Compiling 4 source files to C:\Users\kyh\workspace\ant\ant\build

test1_2:

    [mkdir] Created dir: C:\Users\kyh\workspace\ant\ant\dist

      [jar] Building jar: C:\Users\kyh\workspace\ant\ant\dist\test1_2.20070802.jar

compile:

test1_2:

test2_3:

      [jar] Building jar: C:\Users\kyh\workspace\ant\ant\dist\test2_3.20070802.jar

doc:

    [mkdir] Created dir: C:\Users\kyh\workspace\ant\ant\doc

  [javadoc] Generating Javadoc

  [javadoc] Javadoc execution

  [javadoc] Loading source file C:\Users\kyh\workspace\ant\ant\src\test1\AntTest.java...

  [javadoc] Loading source file C:\Users\kyh\workspace\ant\ant\src\test2\AntTest2.java...

  [javadoc] Loading source file C:\Users\kyh\workspace\ant\ant\src\test2\AntTest2_1.java...

  [javadoc] Loading source file C:\Users\kyh\workspace\ant\ant\src\test3\AntTest3.java...

  [javadoc] Constructing Javadoc information...

  [javadoc] Standard Doclet version 1.6.0_02

  [javadoc] Building tree for all the packages and classes...

  [javadoc] Building index for all the packages and classes...

  [javadoc] Building index for all classes...

zip:

     [copy] Copying 1 file to C:\Users\kyh\workspace\ant\ant\dist\lib

      [zip] Building zip: C:\Users\kyh\workspace\ant\ant\test_20070802.zip

delete:

   [delete] Deleting directory C:\Users\kyh\workspace\ant\ant\build

BUILD SUCCESSFUL

Total time: 2 seconds



사용자 삽입 이미지

반응형

★ Ant 란?

Java 기반의 build 도구로서, file 형식은 XML 이다.
make 와는 달리 플랫폼 독립적인 Java 클래스를 사용하기 때문에 OS에 독립적이다.
이클립스는 Ant 플러그인을 기본으로 내장하므로 따로 설치할 필요 없다.


★ build.xml 생성

사용자 삽입 이미지
← 왼쪽과 같이 파일이 존재한다고 가정한다.
프로젝트(ant)를 선택하고 컨텍스트 메뉴에서 New > File 을 선택한다.


↓ 아래와 같은 창이 뜨면
File Name 에 build.xml 을 입력한다.
자동으로 ant 파일로 인식되어 Package Explorer 에 ant 파일로 표시된다.
(Window > Preference 에서 좌측 Ant 선택, 우측의 Names 에 build.xml 이 있다. 여기에 ,abc.xml 이런식으로 추가입력하면 abc.xml 파일 생성시 ant 파일로 인식된다.)

사용자 삽입 이미지

























사용자 삽입 이미지

← 개미 모양의 build.xml 파일을 볼 수 있을 것이다.




↓ 에디터 창에서 파일을 작성한 후,
Outline View 를 보면 아래와 같이 나타난다.
ant 를 클릭하고 컨텍스트 메뉴에서 Run As를 클릭한다.
Ant Build는 default로 지정된 target이 실행된다.
Ant Build... 를 선택하면 다이얼로그 창이 뜬다.

사용자 삽입 이미지


















사용자 삽입 이미지


↑ Ant Build... 을 선택했을 때의 다이얼로그.
(클릭하면 제대로 된 그림을 볼 수 있을 것이다.)
target name 앞에 체크 박스를 선택하는 순서대로 실행된다.
아랫부분의 Target execution order 란에 선택한 순서대로 표시된다.
순서를 바꾸고 싶으면 체크를 해제한 후 다시 선택하거나,
우측의 Order 버튼을 선택해 위 아래로 위치를 변경하면 된다.

중간에
Sort targets : 체크시, target name이 알파벳 순서대로 정렬된다.
Hide Internal Targets not selected for execution :
Hide Internal Targets 는 description이 없는 타깃을 말한다.
그러므로 체크하면 description이 없는 타깃은 목록에서 사라진다.
반응형

앤트 파일 디버깅

자바 파일을 디버깅하는 것처럼, 이클립스에서 앤트 파일을 디버깅할 수 있으며, 모든 표준 디버깅 기능을 사용할 수 있다. 이것이 이클립스 앤트 통합에서 가장 유용한 기능이다.

타깃 내에 중단점 설정하기

자바 파일로 작업할 때처럼, 한 단계씩 확인을 하고 싶을 때, 작업을 호출하는 타깃에 있는 라인에 중단점을 설정할 수 있다. 라인에 중단점을 넣으려면, 간단히 왼쪽에 있는 회색 바에서 더블 클릭을 하면 된다. 녹색 공이 나타나 중단점이 정해졌음을 나타낸다(그림 15). 클릭함으로써 일시적으로 중단점을 활성화하거나 비활성화할 수 있고, Breakpoints 뷰에서도 중단점을 비활성화로 변경할 수 있다. 비활성화된 중단점은 하얀색 공 모양으로 표시된다. 자바의 중단점과 달리 카운트를 세거나 중단점에 상태를 줄 수 없다는 점-앤트 파일을 디버깅할 때는 결국 필요 없다-을 주의하자.


그림 15. 빌드파일 라인에 중단점 설정
빌드파일 라인에 중단점 설정



위로


빌드 파일 디버깅

이제 디버깅을 시작해 보자. Ant 뷰나 Outline 뷰에서 타깃에 마우스 오른쪽 버튼을 클릭한 다음, Debug As > Ant Build를 클릭하자. 자바 파일을 디버깅할 때처럼, 빌드 파일은 우리가 설정해두었던 중단점이 있는 라인에 도달하게 되면 멈춘다.

여기부터가 중요하다. Debug 뷰에서 Step Over 버튼을 클릭하면 자바 구문이 실행되는 것처럼, 빌드 파일이 한 줄씩 진행된다(그림 16). 각 작업을 순차적으로 진행함으로써, 작업이 실행되고 결과가 나온다. 이를 통해 빌드 프로세스에서 무엇이 잘못 됐는지를 확인할 수 있다. 오른쪽 버튼을 클릭하고, Run to Line을 클릭함으로써 해당 줄에서 마우스 특정 줄에 도달할 때까지 계속 빌드 파일을 실행한다. 이 과정은 선택된 줄에 도착하자마자 중단점을 삭제하는, 줄에 일시적으로 설정하는 중단점과 비슷하다.


그림 16. 빌드 파일에서 줄별로 한 단계씩 진행하기
빌드 파일에서 줄별로 한 단계씩 진행하기

Debug 뷰는 현재 실행되는 작업의 호출 스택을 보여준다. 작업에서 또 다른 타깃을 호출하면(antcall이라고 한다), 호출 스택의 현재 작업 위에 해당 타깃이 나타난다.

Variable 뷰 또한 이용할 수 있다(그림 17) 이 뷰를 열면 앤트에서 변수와 동일한 역할을 하는 모든 앤트 속성을 보여준다. 속성들은 다음 세 부분으로 분류된다.

  • 시스템 속성(System properties): 빌드를 하기 위해 시스템에서 설정하는 속성
  • 사용자 속성(user properties): -D 옵션을 사용해 지정한 것과 같은 속성User properties:
  • 실시간 속성(Runtime properties): 실행되는 동안에 빌드 파일에 정의된 속성

그림 17. 모든 속성을 보여주는 Variable 뷰
모든 속성을 보여주는 Variable 뷰

자바 디버거와는 달리, 앤트 디버거는 Variables 뷰에 있는 속성들의 값을 바꿀 수 없다.

프로젝트 구축을 위해 앤트 빌드파일 사용하기

이클립스 자바 IDE를 사용할 때, 무의식적으로 자바 빌더(Java Builder)를 사용한다. 자바 빌더는 파일을 저장하자마자 즉시 컴파일 작업을 내부적으로 수행하는 조용하고 날쌘 녀석이다.

비록 이 기능이 크게 다룰 문제가 아닌 것처럼 보일지라도, 사실 이클립스의 가장 놀라운 기능 중 하나다. 모든 코드가 에러 상태일지라도, 항상 컴파일되기 때문에, 자바 빌더는 모든 컴파일 과정을 유지해준다. 그러므로 길고, 성가신 컴파일 단계를 먼저 수행하지도 않고, 소스 작성 후 바로 자바 프로그램을 즉각 실행할 수 있다. 이 유용한 기능 덕분에 이클립스 사용자들은 불필요한 노력과 많은 시간을 절약할 수 있었고 프로그래머들 사이에서의 이클립스가 엄청난 인기를 끌 수 있었다.

그러나 우리가 단지 파일을 컴파일하는 것보다 더 많은 일을 하고 싶다면? 전체 프로젝트를 묶는 jar 파일을 만들길 원하고, 프로젝트가 변경될 때마다 특정 디렉토리에 이 jar를 복사하고 싶다면 어떻게 해야 할까? 그리고 매번 이클립스에 지시하지 않고, 내부적으로 이 모든 작업이 수행되길 원한다면? 차분히 앉아, 마음을 가라 앉히고, 코드 몇 줄을 작성한 다음에, 커피 맛을 음미하는 동안 이클립스에서 실제로 무슨 일이 벌어나는지 알 필요도 없이 내부적으로 복잡한 빌드 프로세스를 관리해 준다면 어떨까.

꿈처럼 들리는가? 꿈이 아니다. 우리는 실제로 이 일을 할 수 있다. 우리는 내부적으로 복잡한 모든 빌드 프로세스를 포함하면서 프로젝트의 “builder” 역할을 하는 앤트 빌드 파일을 추가만 하면 된다. 이 일을 하면 마법이 시작될 것이다.

왜 프로젝트 빌더로 앤트를 사용하는가

프로젝트에 있는 클래스 파일을 jar 파일로 만들고, 프로젝트의 최상위 경로에 위치시켜 주는 앤트 빌드 파일이 있다고 가정해 보자(빌드 파일의 정확한 내용은 지금 나오는 내용과 관련이 없다). 우리는 자바 파일이 수정될 때마다 실행되는 빌드 파일을 원하며, jar 파일은 항상 최신 상태를 유지한다. 이 작업은 다음 단계를 거쳐 완성된다.

  1. Package Explorer 뷰에서 해당 프로젝트를 마우스 오른쪽 버튼으로 클릭하고, 다음으로 Properties를 클릭한다.
  2. Builder를 선택하고, 프로젝트에 새로운 빌더를 추가하기 위해New를 클릭하자.
  3. 결과 화면에서 Ant Build를 선택하고, OK를 누르자.
  4. 빌더의 속성 창jd 다음과 같이 나타난다(그림 18). 여기서 빌더를 구성하자.


    그림 18. 빌더 설정 창
    빌더 설정 창

  5. Name 박스에 MyBuilder를 입력하자.
  6. 프로젝트에 있는 빌드 파일을 선택한 다음, Buildfile 바로 아래 Browse Workspace를 클릭하자.
  7. Base Directory 밑에 있는 Browse Workspace를 클릭하고, 빌드 파일이 포함하는 프로젝트를 선택한다. 빌드 파일에 인자를 제공할 수 있지만, 우리는 지금 이 예제에서는 제공할 필요가 없으니, 공백으로 남겨두자.
  8. Refresh 탭을 클릭하자(그림 19).
    프로젝트를 다시 로드하면 앤트와 같은 외부 도구에 의해 로컬 파일 시스템에 생성된 프로젝트가 변경된 부분이 있는지를 찾도록 Eclipse Workbench에 지시하게 된다. 그리고 이제 빌드 스크립트가 끝난 후에 Refresh를 수행해야 할지 말지, 만약 수행한다면 workspace에서 어느 부분을 Refresh를 해야 하는지를 이클립스에 정해줘야 한다.


    그림 19. Refresh 탭
    Refresh 탭

  9. 체크 박스에서 Refresh resources upon completion을 선택하자. 탭 아래에 있는 옵션을 선택할 수 있게 되었다. 얼마나 많은 workspace가 Refresh될 것인지 이클립스에 정해주자. Workbench를 계속 빠르게 실행할 수 있도록 가능한 가장 범위가 좁은 옵션을 선택하자. 이 예제의 경우 단지 현재 프로젝트의 Refresh만 필요하기 때문에, The project containing the selected resource 옵션을 선택하자.
  10. Targets 탭을 클릭하자.


    그림 20. Targets 탭
    Targets 탭


    이제 실제 실행될 빌드 파일을 선택할 수 있고, 좀 더 상세하게 실행될 타깃까지 선택할 수 있다. 네 가지 옵션을 사용할 수 있다.
    • - After a "Clean" – 프로젝트에 clean 작업을 수행할 때마다 타깃을 실행함.
    • - Manual Build – 이 옵션은 자동 빌드 기능이 꺼져 있는 경우에 사용된다. 사용자가 수동으로 빌드를 수행할 때마다, 정해진 타깃이 실행된다.
    • - Auto-Build - 자동 빌드가 수행될 때마다 타깃이 실행된다. 일반적으로 이 옵션은 자바 파일을 저장할 때마다 수행된다.
    • - During a "Clean" – 이 옵션은 After a “Clean” 옵션과는 다르게 타깃이 clean 오퍼레이션을 수행하는 동안에 호출된다. 이 옵션은 clean 오퍼레이션을 수행하는 동안에 파일의 맞춤 삭제 작업을 수행하기 위해 사용된다.
  11. 타깃이 실행되도록 설정하자. 각각의 타깃 옵션에는 매번 오퍼레이션이 수행되는 동안 실행되는 타깃을 설정하는 Set Targets 버튼이 있다. 일반적으로 여기서는 기본 타깃을 설정하지만, 실행되는 순서를 정해줌으로써 어떤 타깃-심지어 다수의 타깃의 동시 설정도 가능-이든지 설정할 수 있다.
  12. 실행하는 빌드 파일을 원하는 오퍼레이션이 무엇이든 이에 상응해 실행되는 타깃을 정의하자.
    이 경우에 우리는 항상 최신 jar 파일을 원하기 때문에 After a “Clean”과 Auto Build 오퍼레이션으로 타깃을 설정하자. 이렇게 설정하기 위해, Set Targets를 클릭하고, 그 다음 실행되는 타깃을 선택하자. Manual Build처럼 어떤 다른 오퍼레이션을 위해 정의되어 있는 타깃이 있다면, Set Targets을 클릭하고 그 오퍼레이션이 수행되는 동안에 실행되는 빌드 파일이 이용될 수 없도록 해당 타깃의 체크 박스에서 선택을 해제하자.

    또한 예를 들어, 매번 Auto Build 오퍼레이션이 수행된 후에 실행되는 타깃까지도 선택할 수 있다는 것을 알아두자. 하지만 일반적으로 빌드 프로세스가 길게 진행된다면 Workbench 속도가 반으로 저하되기 때문에, 이 옵션은 주의 깊게 사용해야 한다. 보통 Manual Build와 After a “Clean”만을 옵션으로 설정한다.
  13. OK를 클릭하자.


이제 새로 추가된 빌더를 테스트할 시간이다. 프로젝트에서 자바 파일을 열고, 몇 가지를 수정하고(예를 들어, 빈 공간을 넣는다든지), 저장을 하자. Auto Build가 수행되고, 콘솔에서 빌드 파일이 선택해놨던 타깃을 수행하는 것을 확인할 수 있다. jar 파일은 빌드되고, Navigator와 Package Explore 뷰에 보인다. 이 모든 작업은 자동으로 매번 발생한다.

결론

이클립스가 제공하는 소스 작성하기, 디버깅, 앤트 빌드 스크립트 내 이동을 위한 막강한 기능들을 살펴 봤다. 심지어 앤트 파일을 백그라운드에서 자동으로 실행함으로써 프로젝트 빌더로 앤트를 사용할 수 있었다. 이제 이클립스에서 매우 친숙하게 빌드 스크립트를 작성할 준비가 되었다.

앞서 설명한 기능을 더 공부해 스스로 앤트 빌드 스크립트를 작성하고 앤트를 프로젝터 빌더로 사용해 보기를 추천한다. 또한 빌드 스크립트를 작성하면서 사용할 수 있는 모든 작업들의 설명을 찾아 볼 수 있는 앤트 공식 레퍼런스 문서를 확인하는 것을 잊지 말자.



참고자료

교육


제품 및 기술 얻기


토론

반응형

앤트로 작업하기

새로운 앤트 빌드파일 만들기

프로젝트에 새 앤트 파일을 추가하자. 이 파일은 튜토리얼의 나머지 부분에서도 사용할 것이다.

  1. Package Explorer를 연다.
  2. Java Project에서 오른쪽 버튼을 클릭하고 New > File을 클릭한다.
  3. New File 윈도우에서 파일 이름을 build.xml로 입력한다.

파일이 생성되고, 앤트 편집기가 열린다. 이제 이 파일에 몇 가지 내용을 추가하자. 편집기의 아무 곳이나 클릭한 다음 Ctrl+Space를 누른다. 그러면 ‘Buildfile template -- simple buildfile with two targets’라는 자동 완성이 나타난다(그림 1). 이것을 클릭해 타깃 두 개가 들어있는 예제 프로젝트를 파일에 추가한다.


그림 1. Buildfile 템플릿 사용하기
Buildfile 템플릿 사용하기

준비가 되었으니, 이제 앤트 편집기에 대해 좀 더 자세히 살펴보자.

앤트 편집기

앤트 편집기의 가장 좋은 기능에는 코드 하이라이트(highlighting), 코드 완성(code completion), 접기(folding), 이름 변경(renaming), 발생한 문제 해결(making occurrences and problems) 같은 것들이 있다.

코드 하이라이트

좀더 쉽게 사용할 수 있도록 편집기에서 빌드 파일의 각 요소들을 다른 색으로 보여준다. 예를 들면 주석은 속성이나 다른 요소들과는 다른 색으로 표시된다. 각각의 요소 유형에 대한 색은 사용자가 원하는 대로 변경할 수 있다.

코드 하이라이트 색을 바꾸려면 다음 세 단계를 거치면 된다.

  1. Window > Preferences > Ant > Editor 클릭.
  2. Syntax 탭 클릭.
  3. 결과 페이지에서 각 요소 유형의 색 선택

코드 완성

앤트 편집기에서는 앤트 빌드 파일을 빠르게 작성할 수 있게 포괄적인 코드 완성 기능을 제공한다. 타깃 정의 안을 클릭하고, Ctrl+Space를 누르면 사용할 수 있는 작업의 모든 목록을 볼 수 있다. 한 작업을 선택하면, 편집기는 시작 태그와 종료 태그를 포함해 자동으로 삽입한다(그림 2).


그림 2. 작업 목록
작업 목록

그러나 이것이 다가 아니다. 앤트 편집기의 코드 완성 기능은 자동 태그 삽입 이상의 기능을 제공한다. 편집기는 빌드 파일에 정의된 타깃들을 알고 있다. 자, 예를 들어 타깃의 이름을 삽입하고 싶을 때, 즉 프로젝트의 default 속성이나 타깃의 depends 속성을 입력하면서 Ctrl+Space를 누르면 우리가 채울 수 있는 이용 가능한 모든 타깃 목록을 보여준다(그림 3).


그림 3. 이용 가능한 타깃들
이용 가능한 타깃들

편집기는 심지어 빌드 파일에 정의되어 있는 속성들까지도 알고 있다. 그래서 속성의 값을 입력해야 할 경우에 먼저 앞에 $(달러 기호)를 입력한 후에 Ctrl+Space를 누르면 빌드 파일에서 정의된 이용 가능한 모든 속성 모든 시스템 속성 목록을 볼 수 있다(그림 4).


그림 4. 이용 가능한 속성 목록
이용 가능한 속성 목록

앤트 편집기에서 제공하는 또 다른 코드 완성 기능은 코드 템플릿이다(그림 5). 빌드 파일에 예제 내용을 추가하기 위해 빌드 파일 템플릿을 사용했을 때 이 기능을 사용한 것이다. 몇몇 템플릿은 앤트 편집기에서 이용할 수 있고, 이를 사용해 쉽고 빠르게 타깃 정의와 속성 정의 등 그 밖에도 많은 내용을 입력할 수 있다. 템플릿을 적용한 다음에 텍스트가 들어가는 위치에 나타난 박스는 자동으로 채워지게 된다(그림 6). 이 박스들은 빈칸을 채우는 일을 좀 더 쉽게 수행하기 위해 중요한 역할을 한다. 이 박스에는 타깃의 이름이나 의존성과 같은 텍스트를 입력할 수 있다. 우리는 Tab 키를 사용해 템플릿에 있는 빈칸(blank) 사이를 이동할 수 있다.


그림 5. 작동중인 코드 템플릿
작동중인 코드 템플릿


그림 6. 템플릿 적용하기
템플릿 적용

접기

앤트 편집기에는 빌드 파일에서 모든 XML 요소들을 접을 수 있다. 간단히 +- 버튼을 클릭하면 다양한 요소를 펼치거나 접을 수 있다. 이 기능을 이용하면 빌드 파일을 빠르게 훑어 볼 수 있기 때문에 매우 유용하다. +아이콘에 마우스를 올려 놓으면 해당 요소의 내용을 담은 창을 띄워준다.




위로


이름 변경

실제로 앤트 편집기에서 가장 유용한 기능 중 하나는 파일의 이름 변경 기능이다. 이 기능을 사용하면 파일 전체를 통틀어 타깃과 속성의 이름을 변경할 수 있다(그림 7). 예를 들어 타깃의 이름을 변경하고 싶다고 하자. 이름에서 마우스 오른쪽을 클릭한 다음에 Rename in file을 클릭하자. 정사각형 박스가 파일 전체에 걸쳐 해당 타깃 이름을 참조하는 요소에 표시가 된다. 이제 타깃 이름을 수정할 수 있고, 파일 전체에 이 변화가 반영될 것이다. 이 특징은 심지어 속성 이름에도 적용된다.


그림 7. 타깃 이름 변경
타깃 이름 변경



위로


동일성 표시

상단에 있는 Toggle mark occurrences 버튼을 클릭하면 동일성 표시 기능을 활성화/비활성화할 수 있다. 이 기능을 활성화하면, 타깃이나 속성의 이름을 클릭했을 때 파일 전체에 타깃이나 속성의 모든 동일성을 확인, 강조해 준다.


그림 8. 동일한 타깃 표시
 동일한 타깃 표시



위로


선택된 요소만 보여주기

Show selected elements only 버튼(그림 9)을 클릭하면 클릭된 요소만 볼 수 있다. 이 기능은 다른 흩어져 있는 것들에 방해를 받지 않으면서, 큰 타깃의 정의를 작성하고 싶을 때 특히 유용하다. 파일 요소의 다른 부분을 클릭해 사리지게 만들 수 있어, 오로지 타깃에만 집중할 수 있다.


그림 9. 현재 타깃만 보기
현재 타깃만 보기



위로


문제 체크하기

앤트 편집기는 우리가 타이핑하는 동안에 해당 빌드 파일에 에러와 경고를 보여줄 수 있다. 이 기능을 이용하면 빌드하는 동안 알 수 없는 에러를 만나는 게 아니라 쉽게 에러를 정의하고, 빌드 파일을 작성하면서 할 수 있는 잠재적인 실수를 조기에 찾을 수 있다.

이 기능이 제대로 동작하는지 보기 위해 build.xml에 project 태그로 시험해보자. default 타깃 값에 빌드 파일에 존재하지 않는 타깃 이름을 입력한다. project 태그에 빨간색의 물결 모양의 표시가 밑줄로 표시된다. 마우스를 이 표시 위에 두면, 창이 뜨고, 기본 타깃이 해당 프로젝트에 존재하지 않는다고 조언해준다. 빨간X 아이콘은 표시의 좌측에 나타난다.


그림 10. 에러를 보여주는 앤트 편집기
에러를 보여주는 앤트 편집기

또한 편집기 창의 오른쪽에 나타나는 막대도 알아두자. 이 막대는 파일의 모든 에러와 경고를 보여준다. 파일에 에러나 경고가 나타나자마자, 빨간색과 노란색에 대응되는 막대가 적절한 위치에 위치하게 된다. 나타난 표시를 클릭하면 에러가 발생한 위치로 이동할 수 있다. 이 기능은 현재 파일에 발생한 수많은 에러와 경고 사이를 쉽게 이동할 수 있게 해주므로 효과적인 검토를 가능하게 해준다. 그리고 파일에 에러가 발생하면 나타나는 오른쪽 막대의 상단에 있는 사각형이 빨간색으로 변경된다. 그러므로 단순히 사각형만 봐도 파일이 정확하게 작성되었는지를 즉시 판단할 수 있다.

다음 과정을 거쳐 앤트 편집기가 문제를 다루는 방법을 변경할 수 있다.

  1. Window > Preferences 클릭.
  2. Ant를 클릭 선택하고, 다음으로 Editor를 선택
  3. Preferences 창에서 Problems 탭을 클릭(그림 11).


    그림 11. 앤트에서 문제를 나타내는 방법 설정하기
    앤트에서 문제를 나타내는 방법 설정하기

  4. 옵션을 선택한다. Ignore all buildfile problems 체크박스를 선택해 모든 에러 체크 기능을 사용하지 않을 수 있다. 기본적으로 이클립스는 모든 앤트 빌드 파일을 XML 파일로 간주하며, 그 중에서 에러를 찾으려고 시도한다. 그렇지만 몇몇 XML 파일에서 에러 체크를 원하지 않는다면, Names 박스에 그 파일의 이름을 넣어주면 된다.

    Names 박스 밑에는 앤트 편집기가 찾을 수 있는 에러의 종류를 볼 수 있고, 각각에 대해 간단한 몇 가지 수준-Ignore, Warning, Error-을 설정할 수 있다. 이 목록에서 Warning을 선택하면 잠재적인 문제를 만들 수 있는 중요한 코드의 에러 유형을 숨길 수 있다. Error를 선택하면 코드의 명확하게 정의되어 있는 몇몇 문제에 맞추어 문제 유형을 지시할 수 있다. 코드를 작성하는 동안에 많은 문제들이 반환되는 문제가 발생하면, 일단 Ignore로 변경해 작업할 수 있지만 추천하지는 않는다.

주의: 막대 또한 동일성 표시하기 기능과 함께 작동될 수도 있다. 동일성 표시하기 기능을 활성화하고, 타깃 이름을 클릭해 보자. 막대는 이를 참조하는 각각의 참조 값의 위치에 대응돼 노란색으로 표시된다. 참조하는 곳으로 이동하려면 표시를 클릭하자.

빌드 파일 이동하기

이클립스에서는 방대한 양의 빌드 파일 내에서 쉽게 이동할 수 있게 도와주는 몇 가지 방법을 제공한다. 하이퍼링크를 포함하는 예제나 기능키 네비게이션뿐만 아니라 Outline과 Ant 두 가지 뷰를 제공한다.

하이퍼링크와 기능 키 이동

Ctrl 키를 누르고 타깃이나 속성 이름 위에 마우스를 올려보자. 그러면 이 이름이 하이퍼링크로 변한다(그림 12). 이 하이퍼링크를 클릭하면 해당 타깃이나 속성의 선언부로 이동한다.


그림 12. 타깃의 참조가 하이퍼링크로 변함
타깃의 참조가 하이퍼링크로 변함

또한 F3 키를 눌러도 타깃이나 속성의 선언부로 이동할 수 있다. General 탭을 열고, Keys를 연 다음 key preference 페이지에 접근해 단축키를 변경할 수 있다.

Outline 뷰

이름에서 추측할 수 있는 것처럼, Outline 뷰는 빌드 파일 전체의 개요를 보여준다(그림 13). Outline 뷰를 이용해 파일에 정의되어 있는 모든 타깃과 속성을 쉽게 볼 수 있다. Internal target과 Public target은 아이콘이 달라 둘의 차이를 쉽게 구별할 수 있다. 기본 타깃도 선택할 수 있다. 특정 타깃을 보기 위해 확장하면, 그 안에 있는 모든 작업들을 볼 수 있다. Outline 뷰에 있는 어느 요소든 클릭해 직접 이동할 수 있다. 이 뷰는 뷰 상단에 몇 개의 버튼을 갖고 있다. 항목을 정렬하거나 Internal target, 속성들, 임포트한 요소들(imported elements)와 최상위 수준의 요소(top-level element)들을 숨기는 필터 기능을 사용할 수 있다.


그림 13. Outline 뷰
Outline 뷰

Outline 뷰에서 타깃을 실행하고 디버그할 수도 있다. 그렇게 하려면 Outline 뷰에서 타깃을 오른쪽 클릭을 하고 Run As (or Debug As) > ANT Build를 클릭한다.

Ant 뷰

많은 경우에 한 사람이 다수의 프로젝트에서 다수의 스크립트로 작업을 하게 된다. 그래서 Navigator나 Package Explorer 뷰로 빌드 파일을 추적하거나 외부 툴의 툴바 리스트를 통해 힘들게 작업하기보다는, 보기 어렵게 흩어져 있는 내용을 보기 쉽게 유지하기 위해 이클립스 Ant 뷰를 사용하자(그림 14).


그림 14. Ant 뷰
Ant 뷰

우선 Window > Show View > Other > Ant > Ant 순으로 클릭해 들어가서 Ant 뷰를 열자. Ant 뷰는 처음 열 때는 공백으로 되어 있기 때문에, 반드시 빌드 파일을 추가해야 한다. + 버튼을 클릭해 창을 열면, 해당 워크스페이스의 프로젝트에 있는 빌드 파일을 선택할 수 있다. 빌드 파일을 선택하고, Run을 클릭하거나 타깃에서 마우스 오른쪽을 클릭하고 Run as > Ant Build를 선택함으로써 타깃을 실행할 수 있다.

앤트의 검색 기능을 사용해 빌드 파일을 추가할 수도 있다. 툴바에서 Flashlight 아이콘을 클릭하면, 창이 뜨고, 검색을 위한 파일 이름을 정의할 수 있다. 특정 문자열이나 문자를 위한 공통의 파일 이름에는 *(별표)나 ?(물음표) 같은 특수 문자를 사용하자. 예를 들어, build로 시작하는 모든 XML 파일 이름과 일치하는 것을 찾으려면 build*.xml을 입력하면 된다. Include buildfile containing errors 체크 박스를 선택하지 않았다면, 에러를 포함하고 있는 파일은 검색되지 않는다. 마지막으로 전체 워크스페이스에서 검색했든지, 작업 단위(working set)에서 검색했든지 간에 관계 없이 빌드 파일을 선택할 수 있다.

Ant 뷰에서 파일을 제거하려면, 빌드 파일을 선택하고 Remove를 클릭하면 된다. Remove All을 클릭하면 모든 뷰가 제거된다.




위로


Ant 뷰와 Outline 뷰의 차이점

Ant 뷰를 처음 보는 많은 사람들은, 이 뷰가 다수의 파일 관리를 위한 Outline 뷰라고 잘못 생각한다. 그러나 이 두 개의 뷰 사이에는 약간의 미묘한 차이점이 존재한다. Outline 뷰가 현재 파일에서 이동을 돕기 위해 고안된 것에 반해, Ant 뷰는 워크스페이스 전체에 흩어져 있는 다수의 빌드 스크립트에서 다수의 타깃을 실행하고 디버깅하는 것을 관리하기 위해 고안되었다.

이 기본적인 차이점은 두 개의 뷰에서 제공되는 특징(기능)을 자세히 들여다 보면 좀 더 명확해진다.

  • Ant 뷰에는 다수의 파일을 추가할 수 있지만, Outline 뷰는 단지 현재 파일의 요약 정보만 보여준다.
  • Outline 뷰에서 타깃을 더블 클릭하면 편집기에서 해당 타깃의 선언부로 이동하지만, Ant 뷰는 실제 타깃을 실행한다.
  • Ant 뷰는 속성을 “실행”할 수 없기 때문에 속성이나 최상위 수준의 요소를 보여주지 않는다.
  • Outline 뷰와 Ant 뷰 둘 다 공개하지 않은 모든 타깃을 숨길 수 있는 Hide internal targets 버튼을 포함하고 있지만, 두 개의 뷰는 서로 다른 목적으로 이 버튼을 사용한다. Outline 뷰에서는 이 버튼을 뷰를 분류해 보기 위한 또 다른 방법으로만 제공하지만, Ant 뷰에서 이 버튼을 제공하는 이유는 퍼블릭 타깃만을 실행할 때 뷰에서 내부적인 타깃을 숨기는 것이 합리적이기 때문이다.




위로

반응형
<?xml version="1.0"?>

<project name="HelloWorld" default="compile" basedir="." >
<property name="src.dir" value="${basedir}" />
<property name="classes.dir" value="${basedir}" />
<property name="jar.dir" value="${basedir}" />
<property name="main-class"  value="HelloWorld"/>

<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">
    <manifest>
        <attribute name="Main-Class" value="${main-class}"/>
    </manifest>
</jar>
</target>

</project>


manifest 사용설명
http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html

ANT (상): Ant 무엇에 쓰는 물건인고?
http://www.javastudy.co.kr/docs/lec_oop/ant/ant1.htm

Ant 사용에 대한 설명
http://www.oracle.com/global/kr/magazine/webcolumns/2002/o62odev_ant.html 

[출처] Java Ant Tutorial|작성자 redcore75

반응형

Jakarta Ant


-. 이번 강좌에서는 지난 시간에 이어 ant 사용에 필수적인 task들에 대해 알아보고

   예제를 통해 한번더 알아보도록 하겠습니다.

   만약 지난 강좌를 아직 보지 않았다면 다음 링크를 참조하세요

   http://www.jakartaproject.com/article/jakarta/1114617006525



I. 집합 태그


1. <fileset>

개요

-. fileset이란 말 그대로 파일의 집합을 말하며 특정 태스크에서 파일을 포함하여야 할때

손쉽게 특정 파일이나 집합을 지정해 주는데 사용된다

주로 클래스패스나, 압축, 파일 카피등의 task에서 사용되어진다


예제

사용예제-1


<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java"/>
  <exclude name="**/*Test*"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes">
  <filename name="**/*.java"/>
  <filename name="**/*Test*" negate="true"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes"> <filename name="**/*.java"/> <not> <filename name="**/*Test*"/> </not> </fileset>

모든 디렉토리의 java파일을 포함시키면서 파일이름중 Test가 들어가는 파일은 제외하는 fileset을 나타낸다

위 세가지 fileset은 같은 의미이다


사용예제-2


<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java, **/*.properties"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java"/>
<include name="**/*.properties"/>
</fileset>

","를 사용하여 나타낼 수도 있고 다로 분리하여 tag를 사용할 수도 있다

위 두 fileset은 같은 의미이다


속성

속성 설명 필수여부
dir 파일집합의 최상위 디렉토리 (루트 디렉토리) dir나 file둘중 하나는 필수
file 특정 하나의 파일을 지정할때 사용
defaultexcludes default excludes 에 명시된 파일 및 디렉토리를 자동적으로 제외하는 속성이며 이기능을 사용하려면 생략한다. 혹은 yes/no 로 값을 준다 No
includes 컴마나 스페이스로 구분된 파일의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 파일을 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 파일의 패턴을 제외하는 속성이며 생략하면 default excludes를 제외하고 어떠한 파일도 제외하지 않는다 No
excludesfile 특정 각각의 파일을 제외할때 사용하는 속성 No
casesensitive 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 No
followsymlinks symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 No


default excludes

excludes를 사용하지 않아도 기본적으로 제외되는 파일 및 디렉토리

     **/*~
     **/#*#
     **/.#*
     **/%*%
     **/._*
     **/CVS
     **/CVS/**
     **/.cvsignore
     **/SCCS
     **/SCCS/**
     **/vssver.scc
     **/.svn
     **/.svn/**
     **/.DS_Store

자 이정도면 fileset은 이제 빠~삭해 지셨겠죠?



2. <dirset>

개요

-. fileset이 파일 집합을 나타냈다면 dirset task는 디렉토리의 집합을 나타낸다. 기본적인 속성은 fileset과 동일하다

차이점은 defaultexcludes가 없다


사용예제


<dirset dir="${build.dir}"> <include name="apps/**/classes"/> <exclude name="apps/**/*Test*"/> </dirset>

apps 이하 디렉토리중 classes 디렉토리를 포함하고 apps 이하 디렉토리중 디렉토리 이름중 Test가 들어가는 디렉토리는 제외한 dirset을 의미한다


속성

속성 설명 필수여부
dir 파일집합의 최상위 디렉토리 (루트 디렉토리) YES
includes 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 디렉토리를 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 특정 각각의 디렉토리를 제외할때 사용하는 속성 No
casesensitive 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 No
followsymlinks symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 No



3. <patternset>

개요

-. 여러 파일이나 디렉토리를 미리 그룹핑해 놓고 이를 특정 아이디를 통해 사용하는 방식을 제공한다. 즉 워드의 매크로 같은 기능이라 보면 쉽게 이해가 갑니다


사용예제

<patternset id="non.test.sources">
  <include name="**/*.java"/>
  <exclude name="**/*Test*"/>
</patternset>
...
<fileset dir="${server.src}">
<patternset refid="non.test.sources"/>
</fileset>
...
<fileset dir="${server.src}">
<patternset refid="non.test.sources">
<include name="**/*.java"/>
</patternset>
</fileset>

예제를 보는바와 같이 patternset은 여러곳에서 동일한 패턴을 사용할때 이를 미리 정의해 놓고 지정한 id의 값을 refid를 통해 재사용 할 수 있다

paternset을 사용하면 코딩양을 줄일 수 있고 변동사항이 있으면 손쉽게 변동 할 수 있다는 점이다


속성

속성 설명 필수여부
includes 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 디렉토리를 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 특정 각각의 디렉토리를 제외할때 사용하는 속성 No



4. <path>

개요

-. 파일과 디렉토리를 함께 나타낼 수 있는 집합. 클래스패스에는 경로뿐만 아니라 *.jar 같은 파일이 같이 사용되듯이 이 path task는 주로 클래스패스로 자주 이용된다

fileset, dirset과 비슷하지만 파일과 디렉토리를 함께 나타낼 수 있다는 점에서 틀리다

path tag역시 patternset과 같이 지정된 id 값을 이용하여 여러 곳에서 재사용 할 수 있다.


사용예제

아래 예제는 ${basedir}/lib/struts.jar, ${base.dir}/lib/log4j.jar 그리고 ${base.dir}/classes 에 클래스패스를 잡는 예제이다.

<path id="base.path">
<pathelement path="lib/struts.jar;lib/log4j.jar"/> <pathelement location="classes"/> </path> ...
<classpath refid="base.path"/>
...

path에 대한 정의를 해놓고 base.path라는 아이디를 이용하여 여러 곳에서 사용할 수 있다


location 속성은 single 파일이나 탐색할 하나의 디렉토리만을 설정할수 있는 반면에,

path는 ";"나 ":"를 사용하여 여러 파일들이나 디렉토리를 설정할 수 있다


II. 파일 태그


1. <copy>

개요

-. 소스 파일을 타겟으로 파일을 복사하는데 사용한다


사용예제

파일 하나 복사

<copy file="myfile.txt" tofile="mycopy.txt"/>


파일 하나를 디렉토리에 복사

<copy file="myfile.txt" todir="../some/other/dir"/>

 

디렉토리를 다른 디렉토리로 복사 

<copy todir="../new/dir">
    <fileset dir="src_dir"/>
</copy>

 

파일 집합을 디렉토리에 복사

<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"/>
    <globmapper from="*" to="*.bak"/>
</copy>

 

파일집합을 디렉토리에 복사하며 파일집합중 TITLE 이란 STRING을 Foo Bar로 대체하며 복사

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
      <filter token="TITLE" value="Foo Bar"/>
    </filterset>
</copy>


속성

속성 설명 필수여부
file 복사할 파일 fileset tag를 사용하지 않는다면 필수
preservelastmodified

소스와 타겟의 최종 수정날짜 파일을 유지하며 복사한다

기본값은 false

No
tofile 복사할 소스파일 fileset tag와 함께 소스 및 타겟을 지정할수있다
todir 복사할 소스 디렉토리
overwrite 타겟의 파일이 최근의 파일이라도 덮어쓸지 여부를 나타내며 기본값은 false No
filtering

복사하는동안 filter를 사용할것인지 여부를 나타내며 기본값은 false

단 이 값이 false일지라도 nested 하게 <filterset>을 사용할수 있다

No
flatten

소스 디렉토리의 구조를 무시하고 특정 디렉토리 한곳에 모든 파일을 복사할지 여부를 나타내며 기본값은 false

No
includeEmptyDirs

<fileset>을 지정하여 복사될 디렉토리중에 파일이 없는 비어있는 디렉토리까지 복사할지 여부를 나타내며 기본값을 true

No
failonerror

복사중 에러가 발생할때 false이면 warning 메세지 로그를, 그렇지 않으면 build시 중지한다

기본값은 true

No
verbose 복사되고 있는 파일의 로그 여부를 나타내며 기본값은 false No
encoding

필터 복사중 사용할 encoding을 나타내며 기본값은 JVM 기본 encoding을 따른다 (ant 1.5 이후)

No
outputencoding

파일기록에 사용할 encoding을 나타낸다

(ant 1.6이후)

No
enablemultiplemappings

true면 주어진 소스 path에대해 모든 mapping 처리를 하며 false이면 첫번째 파일이나 디렉토리에 대해서만 mapping 처리를 한다

이 속성은 <mapper> subelement가 있을때만 관련있다

기본값은 false

(ant 1.6이후)

No
granularity

최근 수정된 시간을 기준으로 파일을 비교 복사시 기준이 되는 시간으로부터 여유분 시간을 나타낸다

즉 소스 파일 서버와 타겟 파일 서버가 다른경우 두 머신간에 시간차이가 있을 수 있기 때문에 이를 사용한다

(ant 1.6.2 이후)

 


2. <delete>

개요

-. 하나의 파일, 하나의 디렉토리 혹은 fileset으로 지정한 특정한 파일들을 삭제할수 있다


사용예제

하나의 파일을 삭제
<delete file="/lib/ant.jar"/>


하나의 디렉토리를 삭제 (이하 디렉토리 및 파일 모두 삭제됨)
<delete dir="lib"/>


현재 디렉토리로 부터 모든 파일중 .bak 파일은 모두 삭제
<delete>
    <fileset dir="." includes="**/*.bak"/>
</delete>


하나의 디렉토리를 삭제하며 빈 디렉토리라도 모두 삭제 (build 자신의 디렉토리도 삭제)
<delete includeEmptyDirs="true">
    <fileset dir="build"/>
</delete>


build 이하 모든 파일을 삭제하며 빈 디렉토리라도 모두 삭제 (build 자신의 디렉토리는 삭제되지 않음)
<delete includeemptydirs="true">
    <fileset dir="build" includes="**/*"/>
</delete>


 


속성

속성 설명 필수사항
file

삭제할 파일

(상대경로나 절대경로나 상관없음)

<fileset>을 사용하지 않는다면 file혹은 dir둘중 하나는 사용하여야 한다
dir

삭제할 디렉토리

verbose

각 삭제되는 파일의 이름을 보져줄 것인지 여부를 나타내며 기본값은 false

No
quiet

시스템이 사용하고 있어 삭제할수 없는 파일이거나

존재하지 않는 파일, 디렉토리등의 메세지를 나태낼지 여부를 나타내며 기본값은 false

No
failonerror

파일 삭제시 에러가 발생하면 build를 중단 하고 현재 사항을 레포팅해줄지 여부를 나타내며 기본값은 true

No
includeemptydirs fileset을 사용할 때 빈 디렉토리empty directory)를 삭제할 것인지 여부를 나타내며 기본값은 false No
includes Deprecated. Use <fileset>. No
includesfile Deprecated. Use <fileset>. No
excludes Deprecated. Use <fileset>. No
excludesfile Deprecated. Use <fileset>. No
defaultexcludes

Deprecated. Use <fileset>.

기본값은 true

No
deleteonexit

파일 삭제시 실패했을때 JVM이 종료될 때 이 파일을 지우도록 할것인지 여부를 나타내며 기본값은 false

(ant 1.6.2 이후)

No


3. <mkdir>

설명

-. 디렉토리를 생성


사용예제

"${dist}" 디렉토리를 생성한다

<mkdir dir="${dist}"/>


"${dist}/lib" 디렉토리를 생성한다

<mkdir dir="${dist}/lib"/>


속성

속성 설명 필수여부
dir 생성할 디렉토리 Yes


4. <move>

설명

-. 파일 혹은 디렉토리를 타겟으로 이동시킵니다 디폴트로 타겟에 이미 파일이 존재하면 덮어씁니다.


사용예제

하나의 파일을 이동시킵니다 (rename과 동일)
<move file="file.orig" tofile="file.moved"/>


하나의 파일을 디렉토리로 이동시킵니다
<move file="file.orig" todir="dir/to/move/to"/>


디렉토리를 새로운 디렉토리로 이동시킵니다
<move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
</move>


위의 task와 동일하며 ant 1.6.3부터 지원합니다
<move file="src/dir" tofile="new/dir/to/move/to"/>


파일집합을 새로운 디렉토리로 이동시킵니다
<move todir="some/new/dir">
    <fileset dir="my/src/dir">
      <include name="**/*.jar"/>
      <exclude name="**/ant.jar"/>
    </fileset>
</move>


.bak을 제외한 모든 파일에 .bak을 추가시키며 이동시킵니다
<move todir="my/src/dir" includeemptydirs="false">
    <fileset dir="my/src/dir">
      <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
</move>



속성

-. delete 속성과 동일합니다



III. java 태그


1. <javac>

설명

-. 자바소스를 컴파일 하는 tag입니다

기본적으로 타겟에 특정 .java에 대해 .class 파일이 없거나 오래된 .class 파일이면 컴파일 대상입니다


사용예제

<path id="compile.classpath">

    <pathelement location="${catalina.home}/common/classes"/>
    <fileset dir="${web.home}/WEB-INF/lib">
      <include name="*.jar"/>
    </fileset>
</path>


가장 일반직인 컴파일 태그 compile.classpath 는 앞의 path 태그에서 정의됨

<javac srcdir="${src}"

          destdir="${build}">

     <classpath refid="compile.classpath"/>

</javac>


include, exclude, debug등을 포함한 컴파일 태그

<javac srcdir="${src}"
          destdir="${build}"
          includes="mypackage/p1/**,mypackage/p2/**"
          excludes="mypackage/p1/testpackage/**"
          classpath="xyz.jar"
          debug="on"
/>


srcdir 대신 <scr> 태그를 이용한 컴파일 태그

<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>



속성

width=20%>속성 설명 필수여부
srcdir 자바 소스가 위치한 디렉토리

Yes

<src>가 존재하면NO

destdir 컴파일된 클래스파일이 위치할 디렉토리 No
includes 컴마나 스페이스로 구분된 파일집합의 패턴을 포함하여 컴파일하며 모든 파일을 사용하려면 생략한다 No
includesfile 각각 개개의 파일을 포함하여 컴파일 No
excludes 컴마나 스페이스로 구분된 파일의 패턴을 제외하하여 컴파일하며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 각각 개개의 파일을 제외하여 컴파일 No
classpath 사용할 클래스 패스 No
sourcepath

사용할 소스패스이며 기본값은 srcdir 값이다

No
bootclasspath bootstrap 클래스 패스 No
classpathref 참조를 통해 사용할 클래스 패스 (refid를 이용한 path 태그) No
sourcepathref 참조를 통해 사용할 소스 패스 No
bootclasspathref 참조를 통해 사용할 bootstrap 패스 No
extdirs 사용할 extednsion이 위치한 경로 (${java_home}/lib/ext/를 말하는것 같음) No
encoding 소스파일에 사용할 encoding (javac의 -encoding과 동일) No
nowarn

컴파일시 -nowarn 옵션을 을 줄지 여부를 나타내며 기본값은 off

반대값은 on

No
debug 컴파일시 debug 모드로 컴파일 하며 기본값은 off No
optimize 컴파일시 optimize 옵션을 사용한다 기본값은 off No
deprecation 컴파일시 deprecation 옵션을 사용한다 기본값은 off No
target 특정 VM 버젼으로 컴파일 할수 있도록 한다 No
verbose

컴파일시 그 내용을 화면에 출력한다

기본값은 no

No
depend

이를 지원하는 컴파일러는 dependecy-tracking를 가능하게 한다

No
includeAntRuntime

ant run time library를 포함하여 컴파일하며 기본값은 yes

No
includeJavaRuntime

VM이 실행될때의 run time library를 포함하여 컴파일하며 기본값은 no

No
fork 외부의 JDK를 사용하여 컴파일 하며 기본값은 no No
executable

fork를 yes로 하였을경우 javac가 실행될 경로를 나타내며 기본값으로는 ant에서 현재 사용중인 java version의 컴파일러를 나타낸다

No
memoryInitialSize

VM내에서 초기 메모리 사이즈를 설정하며 기본값은 VM에 설정된 기본값을 사용한다

No
memoryMaximumSize VM내에서 최대 메모리 사이즈를 설정 No
failonerror

컴파일시 에러가 발생하였을 경우 계속 진행할지 여부를 나타내며 기본값은 true

No
source -source 옵션을 이용하여 컴파일 한다 No
compiler

사용할 컴파일러 설정 list

No
listfiles

컴파일 되는 소스파일들을 list할지 여부를 나타내며 기본값은 no

No
tempdir

ant가 사용하는 임시디렉토리

기본값은 java.io.tmpdir

(ant 1.6이후)

No


2. <javadoc>

개요

-. 자바 소스 파일로 부터 javadoc API 문서를 생성한다


사용예제

간단한 사용예

<javadoc sourcepath="${src.home}"
               destdir="${dist.home}/docs/api"
               packagenames="*">
       <classpath refid="compile.classpath"/>
</javadoc>


아래 3가지 사용예는 동일한 의미이다

<javadoc

           packagenames="com.dummy.test.*"
           sourcepath="src"
           excludepackagenames="com.dummy.test.doc-files.*"
           defaultexcludes="yes"
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">
    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


<javadoc
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">

    <packageset dir="src" defaultexcludes="yes">
      <include name="com/dummy/test/**"/>
      <exclude name="com/dummy/test/doc-files/**"/>
    </packageset>

    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


<javadoc
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">

    <fileset dir="src" defaultexcludes="yes">
      <include name="com/dummy/test/**"/>
      <exclude name="com/dummy/test/doc-files/**"/>
    </fileset>

    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


속성

속성 설명 사용범위 필수여부
sourcepath 자바 소스 위치 all At least one of the three or nested <sourcepath>, <fileset> or <packageset>
sourcepathref 참조된 경로 아이디를 사용하여 소스위치를 지정 (path 의 refid를 사용) all
sourcefiles 컴마로 구분하여 소스 파일을 지정 all
destdir 결과물(java docs) 디렉토리를 지정 all Yes, unless a doclet has been specified.
maxmemory

javadoc VM에 할당할 최대 메모리 사이즈

all No
packagenames

컴마로 구분된 패키지 파일 목록

("*"로 끝나면 하위 패키지까지 모두 javadoc으로 처리한다)

all No
packageList 처리할 패키지를 포함하고있는 파일명 all No
classpath 사용할 클래스 패스 all No
Bootclasspath

사용할 bootstrap 클래스 패스

all No
classpathref 참조된 경로 아이디를 사용하여 클래스 패스를 지정 (path 의 refid) all No
bootclasspathref 참조된 경로 아이디를 사용하여  bootstrap classpath를 지정 all No
Extdirs 설치된 extension 위치 all No
Overview

HTML 문서로부터 overview 문서를 읽어온다

all No
access

Access mode를 지정한다

public, protected, package, private 중 하나의 값을 가지며 기본값은 protected이다

all No
Public 생성된 문서에 public 클래스와 멤버만 보여준다 all No
Protected 생성된 문서에 protected/public 클래스와 멤버만 보여준다 all No
Package 생성된 문서에 package/protected/public 클래스와 멤버만 보여준다 all No
Private 생성된 문서에 모든 클래스와 멤버를 보여준다 all No
Old jdk 1.1 버젼으로 문서를 생성한다 1.2 No
Verbose javadoc을 생성하는동안 메세지를 화면에 출력한다 all No
Locale

사용할 Locale 을 지정한다

(en_US, en_US_WIN, ko_KR)

all No
Encoding 소스파일 encoding 이름 all No
Version @version 단락을 포함한다 all No
Use 클래스와 패키지 사용법에 대한 페이지를 생성한다 all No
Author @author 단락을 포함한다 all No
Splitindex Split index into one file per letter all No
Windowtitle 생성된 문서의 브라우져 타이트을 지정한다 (텍스트) all No
Doctitle

패키지 인덱스 페이지에 대한 타이틀을 지정한다 (html 코드)

all No
Header

각페이지에대한 헤더부분을 지정한다 (html 코드)

all No
Footer 각페이지에대한 푸터부분을 지정한다 (html 코드) all No
bottom 각페이지에대한 버텀부분을 지정한다 (html 코드) all No
link

주어진 URL로 javadoc 출력물에 link를 생성한다

all No
linkoffline Link to docs at <url> using package list at <url2> - separate the URLs by using a space character -- see also the nested link element. all No
group 특정 패키지들에 대한 overview 페이지를 생성한다 all No
nodeprecated @deprecated 정보를 포함하지 않는다 all No
nodeprecatedlist deprecated 목록을 생성하지 않는다 all No
notree 클래스 하이라키를 생성하지 않는다 all No
noindex 인덱스를 생성하지 않는다 all No
nohelp 도움말 link를 생성하지 않는다 all No
nonavbar 네비게이션 바를 생성하지 않는다 all No
serialwarn @serial tag 대한 warning을 생성한다 all No
helpfile help 파일로 사용될 HTML 파일을 지정한다 all No
stylesheetfile CSS 로 사용할 파일을 지정한다 all No
charset 문서를 생성할때 사용될 charset을 지정한다 all No
docencoding 결과 파일(문서)에 사용될 encoding을 지정한다 all No
doclet

doclet을 시작하는 클래스 파일을 지정한다

all No
docletpath

doclet 클래스 패스를 지정한다

all No
docletpathref 참조 아이디값을 이용해 docletpath를 지정한다 all No
additionalparam

javadoc 명령에서 추가적인 파라미터를 추가하도록 한다

all No
failonerror

에러 발생시 build 중단할지 여부를 나타낸다

all No
excludepackagenames 문서를 생성하지 않을 패키지를 컴마로 구분하여 지정한다ment. all No
defaultexcludes

기본적으로 제외되는 목록을 사용할 것인지 여부를 나타낸다

all No
useexternalfile

명령줄을 간단히하기위해 임시파일에 기록된 소스파일명을 지정한다

기본값은 No

all No
source

j2se 1.4 소스코드에 나타난 주장을 처리하도록 javadoc에서 설정한다

1.4+ No
linksource

소스파일에 hyperlinks 생성한다

기본값은 No

(ant 1.6이후)

1.4+ No
breakiterator

새로운 breakiterator 알고리즘을 사용한다 기본값은 No

(ant 1.6이후)

1.4+ No
noqualifier

-noqualifier 옵션을 설정한다

(ant 1.6이후)

1.4+ No
includenosourcepackages

"true"이면 자바소스가 아닌 패키지된 html을 가지고 문서 생성이 한다

(ant 1.6.3이후)

all No (default is false)
executable

실행될 javadoc 위치를 지정한다

(ant 1.6이후)

all No


3. <war>

개요

-. 웹 어플리케이션 배포 파일인 war 파일을 생성해 준다


사용예제


thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif


위의 파일을 WAR로 구성해 보자


<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
  <fileset dir="src/html/myapp"/>
  <fileset dir="src/jsp/myapp"/>
  <lib dir="thirdparty/libs">
    <exclude name="jdbc1.jar"/>
  </lib>
  <classes dir="build/main"/>
  <zipfileset dir="src/graphics/images/gifs"
              prefix="images"/>
</war>


WAR task 후 다음과 같이 구성된다


WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif



속성

속성 설명 필수여부
destfile 생성될 WAR 파일 지정 둘중 하나는 필수
warfile Deprecated
webxml 사용할 deployment descriptor (WEB-INF/web.xml)를 지정 Yes
basedir jar파일로 압축할 디렉토리를 지정한다 No
compress

data를 압축할지 여부를 나타내며 기본값은  true이다

keepcompression 속성을 false로 했을지라도 이는 적용된다

No
keepcompression

이미 존재하는 파일 묶음에 대해 compress을 계속 유지할 것인지 여부를 나타내며 기본값은 fale 이다

(ant 1.6이후)

No
encoding

압축될 파일명에 사용할 encoding을 지정한다

기본값은 UTF8

No
filesonly

Store only file entries

기본값은 false

No
includes 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에 포함하며 생략하면 모든 파일을 WAR한다 No
includesfile 지정된 개개의 파일을 WAR에 포함한다 No
excludes 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에서 제외시키며 생략하면 어떠한 파일로 제외하지 않는다 No
excludesfile 지정된 개개의 파일을 WAR에서 제외시킨다 No
defaultexcludes 기본적으로 제외시키는 기능을 사용할것인지 여부를 나타낸다 No
manifest 사용할 manifest 파일을 지정한다 No
update 이미 존재하는 파일이라면 업데이트할지 덮어쓸지를 결정하며 기본값은 false이다 No
duplicate

중복된 파일이 나타났을 때 "add"할지 "preserve"할지 혹은 "fail"할지를 지정하며 기본값은 "add"이다

No
roundup

파일 시간 비교시 파일 변경 시간을 다음 짝수 횟수의 초(seconds)에 반올림 할지 혹은 내림할지 여부를 나타낸다

기본값은 true
(ant 1.6.2 이후)

No


from http://ant.apache.org/manual/index.html


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

반응형

Jakarta Ant


I. Ant 야 놀자~

Ant 란 "Java 기반의 빌드 도구입니다" 라고들 많이 나와있습니다
근데 이게 대체 무순 뜻이란 말인가 ㅡ.ㅡ;


쉽게 예기해서 환경에 구애받지 않고 간단히 java 소스를 컴파일 하고 필요한 파일이 있다면
그 파일들을 복사나 삭제하며 또한 javadoc 이나 war 같은 배포용 파일까지 생성해 주며
필요하다면 서버에 까지 바로 적용할 수 있도록 도와주는 도구입니다.


또한 여러팀원들이 프로젝트를 진행할 때 새로운 팀원이 참가하더라도
Ant 설정파일을 공유함으로써 손쉽게 참여가 가능하다는 것입니다


아직 사용해 보지 않았다면 얼렁 익혀서 사용해봅시다 무~지 편하답니다



II. 설치해보자
다운로드
Ant

http://ant.apache.org/bindownload.cgi

Ant manual

http://ant.apache.org/manual/index.html

http://ant.apache-korea.org/manual/index.html


다운받은 파일의 압축을 풀고 환경변수 및 패스를 잡아줍니다
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.4.2
set PATH=%PATH%;%ANT_HOME%\bin



III. 간단한 Ant 예제

Ant를 이용하여 web application을 구성할 때 다음의 구조를 유지하기를 권장합니다


build : src, web, docs에서 결과적으로 만들어진 산출물 디렉토리
dist : build를 배포하기 위한 배포 디렉토리
docs : 배포판에 배포할 정적인 문서를 관리할 디렉토리
src : /WEB-INF/classes 에 위치할 java 소스 디렉토리
web : HTML, JSP, 이미지등의 컨텐트 디렉토리 (WEB-INF의 서브디렉토리 포함)
build.properties : build.xml에서 사용할 properties
build.xml : ant 명령으로 실행될 설정파일


src에 하나이상의 java 소스를 테스트로 넣어 놓으세요

자 이렇게 디렉토리를 설정하고 build.xml 을 다음 step에 따라 따라 해 BOA요 ^^&


STEP 1. build.xml 의 기본구조

xml을 기본적인 내용을 안다면 이해하기 쉽습니다

<project name="My Project" default="compile" basedir=".">

 <target name="clean">

   여러 작업

  </target>


  <target name="prepare" depends="clean">

   여러 작업

   </target>


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

    여러 작업

    </target>

</project>

하나의 build 파일은 하나의 project로 구성되며 이는 다시 여러 target으로 구성됩니다

target 이란 빌드 과정중 수행해야 할 task들을 모아놓은 job 단위 라고 보면 됩니다

compile target이라 한다면 compile에 관련된 작업들을 모아놓은 그룹이라 생각하면 쉽게 이해 될겁니다


STEP 2. 시~작 Ant 맛보기~
① build.xml에 다음을 입력한 후 저장 합니다

<project name="Unicorn Project" default="clear" basedir=".">
  <description>Simple Test</description>
 
  <property file="${basedir}/build.properties"/>
 
  <echo message="${catalina.home}"/>


   <target name="clear"/>
   
</project>

-. project

    project는 하나 이상의 target을 정의 합니다 또한 하나의 target은 task의 집합입니다

    ant를 실행할 시에 어느 타겟을 실행할 것인지 지정할 수가 있으며 (예: \ant clear)

    지정하지 않았을 경우 디폴트로 설정된 값이 사용됩니다 이부분이 default="clear"입니다

-. property

    전역변수 설정 혹은 그렇게 사용할 build.properties를 정의 합니다

    build.properties에 catalina.home을 정의하였으며 여러 환경이 변하더라도 이 값만

    변경해주면 build.xml을 수정없이 바로 실행 가능합니다

-. echo

    message 내용을 출력 합니다

-. target

    target 이란 task의 집합으로 실질적으로 실행될 코드들의 묶음입니다

    여기서는 아무 task도 없습니다


② build.properties에 다음을 입력 후 저장합니다

catalina.home=C:\Tomcat 5.0

catalina.home 은 변수로 사용할 것이며 그 값은 C:\Tomcat 5.0입니다


③ 실행

해당 디렉토리로 이동하여 도스창에서 ant 라고 칩니다

c:\예제\ant

Buildfile : build.xml

      [echo] c:\Tomcat 5.0


clear :


BUILD SUCCESSFUL

Total time : 0 seconds


STEP 3. 사전작업 하기~

이번 단계에서는 컴파일 하기전 전역변수 선언이나 컴파일 시 클래스 패스 설정을 해봅시다


① build.xml

<project name="Unicorn Project" default="prepare" basedir=".">
  <description>Simple Test</description>

  <property file="${basedir}/build.properties"/>


  <property name="app.name"      value="unicorn"/>
  <property name="app.path"       value="/${app.name}"/>
  <property name="app.version"   value="0.1-dev"/>

  <property name="build.home"    value="${basedir}/build"/>
  <property name="dist.home"     value="${basedir}/dist"/>
  <property name="docs.home"   value="${basedir}/docs"/>
  <property name="src.home"      value="${basedir}/src"/>
  <property name="web.home"     value="${basedir}/web"/>  


  <path id="compile.classpath">

    <pathelement location="${catalina.home}/common/classes"/>
    <fileset dir="${catalina.home}/common/endorsed">
      <include name="*.jar"/>
    </fileset>
    <fileset dir="${catalina.home}/common/lib">
      <include name="*.jar"/>
    </fileset>
    <pathelement location="${catalina.home}/shared/classes"/>
    <fileset dir="${catalina.home}/shared/lib">
      <include name="*.jar"/>
    </fileset>
    <fileset dir="${web.home}/WEB-INF/lib">
      <include name="*.jar"/>
    </fileset>
  </path>


  <target name="clean"
   description="Delete old build and dist directories">
    <delete dir="${build.home}"/>
    <delete dir="${dist.home}"/>
  </target>
 
  <target name="prepare" depends="clean">

    <mkdir dir="${build.home}"/>
    <mkdir  dir="${build.home}/WEB-INF"/>
    <mkdir  dir="${build.home}/WEB-INF/classes"/>
    <mkdir  dir="${build.home}/WEB-INF/lib"/>
   
    <copy todir="${build.home}">
       <fileset dir="${web.home}">
         <include name="**/*.jsp"/>
         <include name="**/*.css"/>
         <include name="**/*.html"/>
         <include name="**/*.js"/>
         <include name="**/*.jpg"/>
         <include name="**/*.gif"/>
         <include name="**/*.swf"/>
         <include name="**/*.xml"/>
         <include name="**/*.tld"/>
         <include name="**/*.jar"/>

       </fileset>
     </copy>

   </target>  

   
</project>

-. project

    이번에는 default 값을 prepare로 하였습니다 고로 target은 prepare가 실행될 것입니다

-. property

    역시나 build.properties를 정의하였고 여러 전역변수를 설정하였습니다

    build.home 이란 변수에는 ${basedir}/build 값이 정의되었으며

    build.home은 ${build.home}으로 사용할수 있습니다

    궁금하면 <echo message="${build.home}"/> 등으로 출력해 봅시다~

-. path

    ${catalina.home} 은 build.properties에서 정의하였다는것을 기역하실겁니다

    fileset은 파일들의 집합을 나타내는데 어떤 특정파일만 포함 할수 있거나 혹은 어느 특정파일만 제외할 수 있습니다

    특정파일만 포함하는것은 include 태그이며 그 반대는 exclude 입니다

    <fileset dir="${web.home}/WEB-INF/lib">
      <include name="*.jar"/>
    </fileset>

    이부분은 ${web.home}/WEB-INF/lib 에서 *.jar 파일만 클래스패스로 잡겠다는 의미입니다

-. target

   드디어 실질적으로 실행될 target 입니다.

   project 속성의 default가 prepare이므로 prepare target으로 실행하기 위해 가보니  depend 속성으로 "clean"이 설정되어 있습니다

  이것은 "clean" target을 먼저 실행 후 prepare를 실행하라는 말입니다

   즉 prepare는 clean이 실행조건 입니다

   clean target은 delete 태그를 이용하여 배포할 dist 디렉토리와 산출물 디렉토리인 build를 삭제하는 작업입니다
   prepare target으로 다시 와보면 mkdir 는 당연히 디렉토리를 만들라는 뜻입니다

   copy는 todir에 다음 web.home의 모든 fileset을 copy 하라는 의미입니다 여기서도 역시나 include, exclude가 사용될 수 있겠지요

   <include name="**/*.jsp"/> 는 모든디렉토리의 *.jsp 를 카피하라는 의미입니다

    즉 web 디렉토리의 모든 실행 가능할 파일을 build로 옮기는 작업입니다


② 실행

c:\예제\ant

Buildfile : build.xml


clean :

     [delete] : Deleting directory c:\예제\build

     [delete] : Deleting directory c:\예제\dist


prepare :

     [mkdir] Created dir : c:\예제\build\WEB-INF

     [mkdir] Created dir : c:\예제\build\WEB-INF\classes

     [mkdir] Created dir : c:\예제\build\WEB-INF\lib

     [copy] Copying 2 files to Deleting directory c:\예제\build


BUILD SUCCESSFUL

Total time : 1 seconds


STEP 4. 컴파일 하기

이제 컴파일할 모든 준비가 되었습니다

STEP2의 소스에 다음 target을 추가하고 project의 default 값을 compile로 수정한 후 실행해 봅시다


 <target name="compile" depends="prepare"
   description="Compile Java sources">


    <!-- Compile Java classes as necessary -->
    <javac srcdir="${src.home}"
          destdir="${build.home}/WEB-INF/classes">
        <classpath refid="compile.classpath"/>
    </javac>


    <!-- Copy application resources -->
    <copy  todir="${build.home}/WEB-INF/classes">
      <fileset dir="${src.home}" excludes="**/*.java"/>
    </copy>
   
 </target>

-. target

   depends가 prepare이므로 실행 순서는 clean, prepare, compile 입니다

   javac 태스크는 srcdir 인 소스디렉토리에 있는 자바소스를 desdir 쪽으로 컴파일 합니다

   classpath는 위에서 이미 설정한 compile.classpath를 사용합니다

   그 후 properties등 같은 기타 resource 들을 /WEB-INF/classes에 복사합니다

② 실행

c:\예제\ant

Buildfile : build.xml


clean :

     [delete] : Deleting directory c:\예제\build

     [delete] : Deleting directory c:\예제\dist


prepare :

     [mkdir] Created dir : c:\예제\build\WEB-INF

     [mkdir] Created dir : c:\예제\build\WEB-INF\classes

     [mkdir] Created dir : c:\예제\build\WEB-INF\lib

     [copy] Copying 2 files to Deleting directory c:\예제\build


compile :

     [javac] Compileing 1 source file to c:\예제\build\WEB-INF\classes

     [copy] Copying 1 file to c:\예제\build\WEB-INF\classes


BUILD SUCCESSFUL

Total time : 1 seconds


STEP 5. Javadoc 을 이용해 API를 만들어 보고 배포파일도 생성해 보자

이제 컴파일도 했으니 javadoc도 만들어 보고 war 같은 배포파일도 생성해 봅시다

STEP 3.까지의 build.xml에 아래 target을 더 추가하고 project의 default 값에 dist로 설정합니다

① build.xml

 <target name="javadoc" depends="compile"
    description="Create Javadoc API documentation">

     <mkdir dir="${dist.home}/docs/api"/>
     <javadoc sourcepath="${src.home}"
                  destdir="${dist.home}/docs/api"
                   packagenames="*">
       <classpath refid="compile.classpath"/>
     </javadoc>

   </target>


 <target name="dist" depends="compile,javadoc"
   description="Create binary distribution">

    <mkdir dir="${dist.home}/docs"/>

    <copy  todir="${dist.home}/docs">
      <fileset dir="${docs.home}"/>
    </copy>


    <jar jarfile="${dist.home}/${app.name}-${app.version}.war"
         basedir="${build.home}"/>

  </target>

-. target

   target의 실행순서는 clean, prpare, compile, javadoc, dist가 될겁니다

   javadoc target의 javadoc 태스트를 보면 java 소스가 있는 소스디렉토리와

   API를 생성할 타겟 디렉토리를 정해주면 알아서 API를 생성해 줍니다

   만들어진 API는 배포버젼의 dist디렉토리로 해주면 더 좋겠지요


   dist target은 배포파일인 war를 만듭니다

   필요한 문서가 있으면 docs 디렉토리를 만들어 로 복사도 하도록 합시다

   jar 태스크는 위의 방식과 같이 사용합니다


② 실행

c:\예제\ant

Buildfile : build.xml


clean :

     [delete] : Deleting directory c:\예제\build

     [delete] : Deleting directory c:\예제\dist


prepare :

     [mkdir] Created dir : c:\예제\build\WEB-INF

     [mkdir] Created dir : c:\예제\build\WEB-INF\classes

     [mkdir] Created dir : c:\예제\build\WEB-INF\lib

     [copy] Copying 2 files to Deleting directory c:\예제\build


compile :

     [javac] Compileing 1 source file to c:\예제\build\WEB-INF\classes

     [copy] Copying 1 file to c:\예제\build\WEB-INF\classes


javadoc :

     [mkdir] Created dir : c:\예제\dist\docs\api

     [javadoc] Generating Javadoc

     [javadoc] Javadoc execution

     [javadoc] Loading source files for package com.jakartaproject.db...

     [javadoc] Constructing Javadoc information...

     [javadoc] Standard Doclet version 1.4.1

     [javadoc] Building tree for all the packages and classes...

     [javadoc] Building index for all the packaes and classes...

     [javadoc] Building index for all classes...


dist :

     [jar] Building jar :Created dir : c:\예제\dist\unicorn-0.1-dev.war


BUILD SUCCESSFUL

Total time : 3 seconds



VI. Ant 실행

C:\예제\ant -help

ant [options] [target [target2 [target3] ...]]


Options :
  -help                    이 메세지의 표시
  -projecthelp           프로젝트 도움 정보의 출력
  -version                버전 정보의 출력과 종료
  -diagnostics           diagnose 나 report 문제에  도움이 되는 정보의 출력.
  -quiet, -q              한층 더 메세지를 적게
  -verbose, -v          한층 더 메세지를 많게
  -debug                 디버그 정보의 출력
  -emacs                 adornments 없이 로그 정보의 생성(produce)
  -logfile <file>         로그를 지정 파일에 출력
    -l     <file>                ''
  -logger <classname>    로그 생성을 실행하기 위한 클래스
  -listener <classname>  프로젝트 청취자(listener) 역할의 class의 인스턴스를 추가
  -buildfile <file>            지정된 빌드 파일의 사용
    -file    <file>              ''
    -f       <file>              ''
  -D<property>=<value> 지정된 프로퍼티의 값의 사용
  -propertyfile <name>    모든 프로퍼티를 파일로부터 로드  (-D프로퍼티보다 전에)
  -inputhandler <class>  입력 요청(requests)를 취급하는 클래스
  -find <file>                 파일시스템의 루트로 향해 빌드파일을  검색하고 그것을 사용


C:\예제\ant

현재 디렉토리에 있는 build.xml 파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.


C:\예제\ant compile

현재 디렉토리에 있는 build.xml이 실행되며 파라미터로 compile을 지정하면 project의 default 값을 무시하고 compile target을 실행합니다 물론 depends 가 있다면 먼저 실행합니다

 

C:\예제\ant -buildfile test.xml

현재 디렉토리에 있는 test.xml 파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.


C:\예제\ant -buildfile test.xml dist

현재 디렉토리에 있는 test.xml 파일을 이용해, dist 라는 이름의 타겟으로 Ant 를 실행합니다.


C:\예제\ant -buildfile test.xml -Dbuild=build/classes dist

현재 디렉토리에 있는 test.xml 파일을 이용해, dist 라는 이름의 타겟으로, build 프로퍼티에 build/classes 값을 설정해 Ant 를 실행합니다.


VII. 기본 프로퍼티

Ant는 다음과 같은 프로퍼티를 기본으로 제공합니다

basedir : 기본 디렉토리 경로를 나타내며 project 태그의 basedir에 명시되어 있습니다

ant.file : 빌드 파일의 절대 경로입니다

ant.version : Ant 버젼을 나타냅니다

ant.project.name : project 태그의 name에 명시되어있습니다

ant.java.version : 자바 버젼을 나타냅니다

자바 시스템 프로퍼티를 사용 가능 합니다

   예) ${os.name} 참고 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()


<echo message="${ant.file}"/> 으로 한번 출력해 보면 이해가 쉽습니다


다음 시간에는 각 타스크의 종류와 상세 설정에 관해 알아봅시다


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

+ Recent posts