본문 바로가기

Dev.../웹서비스

[펌] Ant으로Java의 빌드를 간단하게 한다

제2회 Ant그리고Java의 빌드를 간단하게 하는


오카모토 타카시
NTT데이터 기술개발 본부/Ja-Jakarta Project
2003/1/16


 이번은 ,Java Solution포럼으로 간 「제7회 독자 조사:옆의 회사는Jakarta Project을 활용하고 있어? 」(으)로 ,Tomcat에 이어 이용자가 많았던 빌드 툴의 것Ant을 채택합니다. Ant에 대해서는 , 기본편과 응용편의2회로 나누어 소개합니다. 기본편이 되는 이번은 ,Ant의 개요와 기본적인 사용법에 대해 해설합시다.

 빌드 툴이라고 하면(자) ,make를 떠올리는 (분)편도 많다고 생각합니다만 ,Ant의 빌드 파일은XML으로 기술한다고 하는 특징이 있어 ,Java라는 친화성도 높아지고 있습니다. 전술의 독자 조사에 의하면 , 현재 이용중의 개발툴로서 「에디터+JDK」가 가장 많았습니다만 , 확실히 이 개발 패턴은Ant을 사용하는 것이 왕도라고 할 수가 있겠지요.

 Borland JBuilder등의IDE를 사용하고 있는 (분)편은 , 「IDE을 사용해 빌드 하면Ant은 필요없는 것이 아닌가?」라고 생각될지도 모릅니다. 그러나 , 예를 들면 ,Windows환경에서 개발을 실시해 , 동작 확인을UNIX위에서 실시한다고 하는 크로스 카이하츠를 실시하고 있는 경우 , 원시 코드의 불편을 찾아낼 때마다Windows위에서 빌드 해 ,UNIX환경에 카피해 동작 확인한다……라고 한 시간이 드는 작업을 반복하고 있을 것은 없습니까? 동작 확인을 행하기 위한 머신이 네트워크에 접속되고 있는 경우는 아직 좋습니다만 , 그렇지 않은 경우는 플로피 디스크나CD-R에 기입하는 등 , 수고가 배증합니다.

 이러한 때에도 ,Ant를 이용하는 것으로써 ,JDK가 인스톨 된 환경이면 , 간단하게 소스로부터 빌드 할 수가 있어 파일 카피의 수고를 줄일 수 있고 개발 효율이 오릅니다. 그리고 , 최근의 것IDE은Ant을 서포트하고 있는 것도 많기 때문에 ,Ant그리고 작성해 두면 , 다른IDE위에서 간단하게 빌드 할 수도 있습니다.

 Ant(을)를 사용해 보자

 「백문은 일견 밖에않고」라고 하는 것으로 , 우선은Ant을 사용해 봅시다. Ant(을)를Jakarta의 사이트http://www.apache.org/dist/ant/binaries/로부터 다운로드해 , 적당한 디렉토리에 해동해 주세요. 필자의 환경에서는 , 집필시의 최신 버젼1.5.1을/usr/local/jakarta-ant-1.5.1(Windows의 경우는 ,c:\usr\local\jakarta-ant-1.5.1) 에 전개했습니다.

 그럼 , 샘플을 다운로드해 실제로 시험해 봅시다. 여기로부터 다운로드해 주세요.

 Ant의 환경 설정을 실시합니다. UNIX환경의 경우 , 환경 변수JAVA_HOME에JDK의 인스톨 디렉토리를 ,ANT_HOME에Ant의 인스톨 디렉토리를 설정해 ,PATH를$ANT_HOME/bin에 통하면 준비는 완료입니다. 준비를 할 수 있으면(자) , 아래와 같이 샘플을 전개해 ,ant커멘드를 실행해 주세요.

●UNIX(bash) 의 경우
$ export ANT_HOME=/usr/local/jakarta-ant-1.5.1
$ export JAVA_HOME=/usr/local/j2sdk1.4.1_01
$ export PATH=/usr/local/jakarta-ant-1.5.1/bin:${PATH}
$ jar xvf hello-ant.zip
$ cd hello-ant
$ ant
Buildfile: build.xml

compile:
compile타겟의 실행
[mkdir] Created dir:
/tmp/hello-ant/classes
[javac] Compiling 2 source files to
/tmp/hello-ant/classes


jar: jar타겟의 실행
[jar] Building jar:
/tmp/hello-ant/foo-1.0.jar

 최초의 환경 변수의 설정은 ,.bashrc등에 써 두면(자) 좋을 것입니다.

 Windows의 환경의 경우는 , 유저 환경 변수의JAVA_HOME,ANT_HOME,PATH를 각각 , 아래와 같이 설정합니다.

JAVA_HOME c:\j2sdk1.4.1_01(J2SDK의 인스톨 디렉토리)
ANT_HOMEc:\usr\local\jakarta-ant-1.5.1
PATHc:\usr\local\jakarta-ant-1.5.1\bin

 환경 설정을 할 수 있으면(자) , 이하와 같이ant커멘드를 실행해 주세요. 다음과 같은 실행 결과를 얻을 수 있을 것입니다.

●Windows의 경우
C:\tmp> jar xvf hello-ant.zip
C:\tmp> cd hello-ant
C:\tmp\hello-ant> ant
Buildfile: build.xml

compile: compile타겟의 실행
[mkdir] Created dir: C:\tmp\hello-ant\classes
[javac] Compiling 2 source files to C:\tmp\hello-ant\classes


jar: jar타겟의 실행
[jar] Building jar: C:\tmp\hello-ant\foo-1.0.jar

BUILD SUCCESSFUL
Total Time: 7 seconds

 이것으로 ,Java소스의 컴파일과jar파일foo-1.0.jar의 작성을 했습니다. Ant(은)는 실행한 커런트 디렉토리에 있는 빌드 파일build.xml을 읽어들여 , 빌드를 실행합니다. 이 예에서는 , 다음에 소개하는 빌드의 실행 단위 「타겟」의 디폴트치가jar되고 있으므로 ,jar타겟의 실행과jar타겟으로 의존한compile타겟을 실행하고 있습니다.

 그럼 ,classes디렉토리아래의 것Foo1.class을 실행 배어 봅시다. 이하의 실행 결과를 얻을 수 있을 것입니다.

●Windows의 경우
C:\tmp\hello-ant> cd classes
C:\tmp\hello-ant>classes>java Foo1
안녕하세요Ant

 디폴트에서는 실행됩니다만 , 샘플에는javadoc의 생성 프로세스도 포함하고 있기 (위해)때문에 , 다음과 같이javadoc타겟을 지정해 실행하면(자) ,api디렉토리아래에JavaDoc가 생성됩니다.

ant javadoc

그리고 ,build.xml이외의 빌드 파일을 이용하고 싶은 경우는 ,-f옵션으로 ,

ant -f [빌드 파일명]

으로 , 빌드 파일을 지정할 수도 있습니다.

 Ant의 특징

 Ant의 구체적인 해설에 들어가기 전에 ,Ant의 특징에 대해 정리합시다. Ant(을)를 사용하면(자) 이하와 같은 메리트가 있습니다.

(1) 복잡한 컴파일 프로세스를 간략화 가능
 Ant(을)를 이용하면(자) , 컴파일 ,jar파일 작성등의 빌드 순서를 형식화할 수 있으므로 , 복잡한 빌드 순서를 간략화할 수 있습니다. 반대로 , 간단한 빌드 커멘드로 컴파일 할 수 있는 경우(예를 들면 , 원시 파일이1개 밖에 없고 ,javac커멘드를1회 실행하는 것만으로 컴파일 가능한 경우등 ) 는 , 빌드 파일의 작성에 시간이 들어 , 오히려 작업 부하가 증가합니다.

(2) 풍부한Java개발툴에의 대응
 javac,jar,rmic,war,native2ascii등의 커멘드의 실행에 대응하고 있습니다. Ant그럼 , 각각의 커멘드를 실행하기 위한 「태스크」라고 불리는 클래스가 준비되어 있습니다. 그리고 , 최근에는 ,JavaBeans으로부터EJB를 생성하는xdoclet/vdoclet등 ,Jakarta이외로부터도 태스크가 제공되고 있습니다.

(3) 처리 프로세스의 그룹화
 소스의 컴파일이나jar파일의 생성 ,javadoc생성 등 , 있는 결정된 처리를 타겟으로 정리할 수가 있습니다. 예를 들면 ,javac태스크와native2ascii태스크를 정리해 컴파일 타겟으로 할 수가 있습니다. 타겟으로보다 , 그때그때로 필요하게 되는 처리만을 간단하게 선택해 실행할 수 있게 되어 있습니다.

(4) 의존관계(dependencies)의 해결
 예를 들면jar파일의 작성 전에는 , 소스의 컴파일이 필요합니다. Ant(은)는 이러한 처리의 의존관계(dependencies)을 해결할 수 있습니다. 그 때문에jar파일을 작성하기 전에 , 소스가 컴파일 되고 있는지 아닌지를 의식할 필요가 없어집니다.

(5) 인크리멘탈인 빌드
 빌드 처리를 실시하는 태스크는 , 기본적으로 타임 스탬프를 조사해 처리가 필요한 파일만 처리합니다. 예를 들면 , 한 번 소스를 컴파일 한 다음에 소스를 변경했을 경우 , 변경이 있던 소스만을 재컴파일 할 수가 있습니다.

 Ant의 사용법을make과 비교해 이해한다

 그럼 ,make그리고 이용하는Makefile과Ant의 빌드 파일을 대비하면서 ,Ant의 사용법을 보고 갑시다. 우선은 ,make그리고 사용하는Makefile(리스트1)를 봐 주세요 (덧붙여 리스트1와 리스트2는 기능마다 분류 하고 있습니다 ).

빨강변수 설정
파랑jar파일의 생성
초록컴파일 실행
보라색javadoc생성
회색파일의 클린 업

리스트1 Makefile의 예
######## 변수의 설정 ########

# 원시 파일의 일람
BUILD_SRC=src/foo1.java src/pkg/foo2.java

# 원시 파일로부터 생성되는 클래스 파일
BUILD_DEST=classes
BUILD_FILES=$(BUILD_DEST)/foo1.class $(BUILD_DEST)/pkg/foo2.class

# JavaDoc파일
JAVADOC_DEST=api
JAVADOC_FILE=$(JAVADOC_DEST)/foo1.html $(JAVADOC_DEST)/pkg/foo2.html

# jar파일
JAR=foo.jar


## jar파일 생성

jar:$(JAR)
$(JAR):$(BUILD_FILES)
    jar cvf   $(JAR) -C $(BUILD_DEST)/ .


## 컴파일 실행
compile:$(BUILD_FILES)
$(BUILD_FILES):$(BUILD_SRC)
    mkdir -p $(BUILD_DEST)
    javac -d $(BUILD_DEST) $(BUILD_SRC)


## javadoc생성
javadoc:$(JAVADOC_FILE)
$(JAVADOC_FILE): $(BUILD_SRC)
    javadoc -d api $(BUILD_SRC)

## 파일의 클린 업
clean:
    rm -fr $(BUILD_DEST) $(JAVADOC_DEST)

 이Makefile를Ant의 빌드 파일(build.xml) 에 고쳐 쓰면(자) 다음과 같이 됩니다 (방금전 실행했다Build.xml를 조금 간략화하고 있습니다 ).

리스트2 Ant의 빌드 파일(build.xml)
<?xml version="1.0" encoding="Windows-31J"?>

<project name="foo" default="jar" basedir=".">


 
<!-- 원시 파일의 디렉토리 -->
  <property name="build.src" value="src"/>

  <!-- Class파일을 출력하는 디렉토리 -->
  <property name="build.dest" value="classes"/>

  <!-- Javadoc 를 출력하는 디렉토리 -->
  <property name="javadoc.dest" value="api"/>

  <!-- 프로젝트명 -->
  <property name="project" value="foo"/>

  <!-- 버젼 번호 -->
  <property name="version" value="1.0"/>

  <!-- 출력jar파일 -->
  <property name="buuld.jar" value="${project}-${version}.jar"/>



 
<!-- jar파일 작성 -->
  <target name="jar" depends="compile">
    <jar
          jarfile="${build.jar}"
          basedir="${build.dest}">
    </jar>
  </target>



 
<!-- 컴파일 실행 -->
  <target name="compile">
    <mkdir dir="${build.dest}" />
    <javac srcdir="${build.src}"
           debug="${debug}"
   destdir="${build.dest}"
    />
  </target>



 <!-- Javadoc작성 -->
  
<target name="javadoc">
    <javadoc
      packagenames="*"
      sourcepath="${build.src}"
      destdir="${javadoc.dest}">
    </javadoc>
  </target>



 <!-- 파일의 클린 업 -->
  
<target name="clean">
    <delete dir="${build.dest}" />
    <delete file="${build.jar}" />
  </target>


</project>

 가장 큰 차이로서Makefile는 커멘드의 나열로 기술되고 있습니다만 ,Ant의 빌드 파일은XML으로 기술되고 있습니다. 구체적으로 기능 마다 차이를 봅시다.

디폴트의 처리의 지정

 여기서의 디폴트의 처리란 , 옵션의 지정을 생략 했을 때 ,Ant라고Make가 무슨 처리를 실시하는지 , 라고 하는 것을 가리킵니다. 빌드 커멘드를 실행했을 때의 디폴트의 처리는 ,Make의 경우 , 제일 처음에 기술된 처리가 됩니다만 ,Ant그럼project태그로 지정합니다. 상기의 예에서는 ,jar파일 작성을 디폴트의 처리로 하고 있습니다. Makefile파일에서는jar:$(JAR)의 부분이 ,Ant의 빌드 파일에서는<project .. default="jar"…>의 부분이 해당합니다.

변수의 설정

 Ant도Make도 빌드 파일 중(안)에서 자유롭게 참조 가능한 변수를 선언할 수가 있습니다. make(은)는 ,Makefile의 선두의 블록으로 이하와 같이 변수 설정을 실시합니다.

변수명=치

 그리고 , 이하와 같이 변수의 참조를 실시합니다.

$(변수명)

 이것에 대해서 ,Ant는 , 이하와 같이property태그를 사용해 , 변수(Ant에서는 변수를 통상 프롭퍼티라고 부릅니다 ) 의 설정을 실시합니다.

<property name="변수명" value="치"/>

 그리고 , 이하와 같이 변수의 참조를 실시합니다.

${변수명}

커멘드의 실행

 make그럼 , 예를 들면 아래와 같은 기술을 보면 알 수 있도록(듯이) ,mkdir,javac등의 쉘 커멘드를 직접 호출해 처리를 진행시킵니다.

$(BUILD_FILES):$(BUILD_SRC)
  mkdir -p $(BUILD_DEST)
    javac -d $(BUILD_DEST) $(BUILD_SRC)

 이것에 대해서Ant에서는 , 전술한 것처럼javac,jar,javadoc등 , 실제로 실행하는 커멘드에 대응 지을 수 있었던 태스크를 실행하는 것으로 처리를 진행시켜 나갑니다. 태스크는 , 다음과 같이 표기합니다.

<태스크명 인수(속성)="치" …>
    <인수(요소)>치</인수(요소)>
</태스크명>

 인수는 , 각 태스크 고유의 값을 받습니다만 , 예를 들면 ,mkdir,delete,copy등의 파일 조작을 실시하는 태스크는 ,dir(디렉토리를 지정한다 ) 등의 공통 인수를 지정할 수 있습니다. 그리고 , 인수는 , 속성과 요소의2종류를 지정할 수 있습니다만 , 기본적으로는 속성에 인수를 설정합니다. 파일의 집합 , 클래스 패스 등은 인수로 지정할 수도 있습니다. 태스크의 구체적인 사용법에 대해서는 , 자세하게 후술 합니다.

의존관계(dependencies)의 기술

 빌드를 실시할 때 ,jar파일의 작성 전에는 , 소스의 컴파일이 필요등의 의존관계(dependencies)가 발생합니다만 ,make도Ant도 의존관계(dependencies)를 기술할 수가 있습니다. Makefile그럼 ,

생성 파일:중간 파일
  커멘드2  # 중간 파일로부터 생성 파일을 생성하는 커멘드
  (커멘드2')  # 복수의 커멘드를 실행하고 싶은 경우 , 개행해 기술

중간 파일:원시 파일
  커멘드1  # 원시 파일로부터 중간 파일을 생성하는 커멘드
  (커멘드2') # 복수의 커멘드를 실행하고 싶은 경우 , 개행해 기술

이라고 하는 형식에서 , 의존관계(dependencies)를 기술합니다. make(은)는“:”보다 좌측의 파일의 타임 스탬프와 우측의 파일의 타임 스탬프를 조사해 , 왼쪽에서(보다) 오른쪽의 타임 스탬프가 새로운 경우 , 혹은 , 좌측의 파일이 존재하지 않는 경우 , 커멘드를 실행합니다. 예를 들면 ,

$(JAR):$(BUILD_FILES)
  jar cvf  $(JAR) -C $(BUILD_DEST)/ .

$(BUILD_FILES):$(BUILD_SRC)
  mkdir -p $(BUILD_DEST)
  javac -d $(BUILD_DEST) $(BUILD_SRC) 

에 주목하면(자) ,src/foo1.java,src/pkg/foo2.java ($(BUILD_SRC))에 대해서 ,mkdir/javac가 실행됩니다. 생성된 클래스 파일classes/foo1.class classes/pkg/foo2.class ($(BUILD_FILE))에 대해서jar가 실행되어foo.jar ($(JAR))가 생성됩니다.

 각 스텝은 , 처리의 필요가 없으면 스킵 됩니다.

주:“jar:$(JAR)”이라고 하는 행은 ,make jar 커멘드로jar파일을 생성하기 위한 굳이 실행하지 않는 더미행입니다.

 이것에 대해서 ,Ant는 , 타겟으로 대해 의존관계(dependencies)를 기술해 정의합니다.

<target name="타겟1">
  태스크2
</target>

<target name="타겟2" depends="타겟1">
  태스크1
</target>

 이 예는 ,Ant이 타겟2을 실행하려고 하면(자) , 타겟1이 실행이 끝난 상태인지 어떤지 조사해 ,

미실행의 경우
  타겟1을 실행한 후 , 타겟2을 실행

실행 끝난 경우
  타겟1을 실행하지 않고 , 타겟2을 실행

이라고 하는 동작을 합니다. 여기서 주의가 필요한 것은 ,make은 , 생성된 파일과 소스의 타임 스탬프를 조사해 의존관계(dependencies)를 처리합니다만 , 타겟은 「현재 실행되고 있는Ant으로 벌써 처리되었는지 어떠했는지」를 조사해 파일의 타임 스탬프를 조사하고 있지 않습니다. 즉 ,Ant을 실행할 때 마다 각 타겟은 실행됩니다. 실제로 파일의 타임 스탬프를 조사해 커멘드를 실행할지 어떨지는 , 태스크가 판별합니다.

 Ant의 이점

 그런데 , 여기까지의 이야기를 읽으면(자) , 언뜻 봐 , 「할 수 있는 것은Makefile것과 같지만 ,XML그리고 기술해야 하는 분 ,ant(분)편이 귀찮지?」라고 생각되는 (분)편도 있을지도 모릅니다. 여기까지의 내용을 정리하면(자) ,Ant를 사용하면(자) 다음과 같은 메리트가 있습니다.

(1) 파일의 의존관계(dependencies)를 기술할 필요가 없어진다
 태스크가 주어진 각 소스와 생성되는 파일의 타임 스탬프를 조사해 , 처리가 필요한 소스만을 처리해 줍니다. Makefile(와)과 같이1개1개 파일을 지정해 의존관계(dependencies)를 기술할 필요는 없습니다.

(2) 처리 대상이 되는 파일을 개별적으로 기술할 필요는 없다
 Makefile그럼 ,SRC=foo1.java foo2.java과 같이 개별적으로 파일을 지정할 필요가 있었습니다. 이것에 대해서Ant에서는 ,srcdir="..."과 같이 디렉토리를 지정하면 , 그 디렉토리 이하의 모든 파일을 처리 대상으로 해 줍니다. Makefile그렇지만find을 이용하면 , 어느 디렉토리 이하의 것 *.java에 성냥 하는 파일등을 그룹화 할 수가 있습니다만 , 거기에 비교해도 시간이 들지 않습니다.

 다만 , 상기의 메리트는 ,Java의 어플리케이션의 빌드시에 받게 되는 혜택으로 ,C언어의 개발등으로는 ,task으로부터 커멘드 호출을 실시하는 만큼 되어 버려 ,Ant의 혜택은 받을 수 없기 때문에 주의해 주세요.

 커멘드를 실행하는 「태스크」의 사용법

 다음에 ,Ant의 요점인 태스크 중(안)에서 , 특별히 중요하다고 생각해지는javac,jar,javadoc,war,echo에 임해서 소개합니다. 인수에 대해서는 , 잘 사용되는 것을 발췌해 게재하고 있습니다. 보다 상세를 알고 싶은 경우는Jakarta프로젝트의태스크 일람을 참조해 주세요. 일본어에 의한 정보를 갖고 싶은 경우는 ,Ja-Jakarta에 의한 일본어 번역을 봐 주세요.

●javac태스크

 javac(은)는 그 이름대로 ,javac커멘드를 태스크로 한 것으로 ,겉(표)1에 나타내는 인수를 가집니다.

표1 javac태스크의 인수
인수기능 필수인가? (디폴트치)
srcdirjava파일의 장소YES
destdir클래스 파일을 출력하는 장소YES
classpathref 미리path로 설정한 패스를 지정 NO
encoding Java파일의 인코딩 NO(시스템의 인코딩)
excludes컴파일 대상으로부터 제외하고 싶은 파일의 리스트 NO
debug 디버그용으로 컴파일 하는지 어떤지 판단하는 플래그NO(false)
※true/false를 지정한다

 클래스 패스에jar파일을 몇개인가 포함하고 싶은 경우는 ,path태스크와 조합해 이용하면(자) 편리합니다. 예를 들면 ,lib디렉토리아래의jar파일에 모두 클래스 패스를 통해 , 서브 렛 클래스를 위해서(때문에)Tomcat혹은WebLogic의jar파일에 클래스 패스를 통해 컴파일을 실시하려면 , 다음과 같이 기술합니다.

<!-- javac그리고 이용하는 클래스 패스의 설정 -->
<path id="myclasspath">
  <!-- lib디렉토리 이하의 것include으로 지정한 파일을myclasspath
          에 포함한다. --> 
  <fileset dir="lib">
    <!-- 모든jar파일을 클래스 패스에 포함하는 -->
    <include name="*.jar"/>
  </fileset>

  <!-- 각 어플리케이션 서버 고유의 것
       jar을myclasspath에 포함하는
       (특정의jar파일을 지정하는 경우는 ,pathelement을 이용)-->
  <pathelement path="${catalina.home}/commons/lib/servlet.jar"/>
  <pathelement path="${weblogic.home}/server/lib/weblogic.jar"/>
</path>
..
<!-- 설정했다myclasspath를 이용해 컴파일 -->
<javac  srcdir="src/java"
        excludes="**/bak/*"
        destdir="build/classes"
        encoding="Windows-31J"
        classpathref="myclasspath" />

 path의 설정은 ,javac을 실행하는 타겟내에 포함할 수도 있습니다만 , 초기설정이라고 하는 의미로 , 프롭퍼티를 정의한 뒤에 들어갈 수 있으면(자) 좋을 것입니다.

●jar태스크

 jar태스크는 ,jar파일을 작성하는 태스크로 ,겉(표)2의 인수를 가집니다.

표2 jar태스크의 인수
인수기능 필수인가?
basedir jar에 포함하는 파일의 루트 디렉토리YES
destfile jar파일명YES
manifest마니페스트 파일NO

 예를 들면 , 마니페스트 파일에manifest를 지정해build/classes이하의 파일을jar에 압축하고 싶은 경우 , 다음과 같이 기술합니다.

<jar destfile="foo.jar"
basedir="build/classes"
manifest="manifest"/>

●war태스크

 war태스크는 ,Web어플리케이션의WAR어카이브(archive)를 작성합니다. war파일 자체 , 원래jar형식의 파일인 일도 있어 ,jar파일과 같습니다만 ,war용으로 몇개인가 인수가 추가되고 있습니다. 여기에서는 ,jar에 추가된 인수를겉(표)3에 소개합니다 ( 실은 ,war태스크를 실행하는 클래스 자신이jar태스크의 클래스를 계승하고 있습니다 ).


표3 war태스크의 인수
인수기능 필수인가?
webxmlWeb어플리케이션의 배치 기술자META-INF/web.xml파일을 지정YES
lib WEB-INF/lib 디렉토리에 포함하는jar파일. war태스크에 네스트 한 태그로서 포함하는

NO

classes WEB-INF/classes디렉토리에 포함하는 클래스 파일을 지정. war태스크에 네스트 한 태그로서 포함한다NO

※:update옵션(기존의 파일을 덧쓰기한다 ) 을true로 설정해 있으면 , 설정할 필요는 없습니다

 Web어플리케이션의 배치 기술자에게myweb.xml, 서브 렛등의 클래스 파일을classes디렉토리 이하의 파일로 지정해 ,lib디렉토리 이하의jar파일을 포함하는 샘플은 다음과 같이 됩니다.

<war dest="sample.war"
     webxml="myweb.xml">
    <classes dir="classes" />
    <lib dir="lib/*.jar" />
</war>

 classes(와)과lib는 , 네스트 한 태그에 포함할 필요가 있는 점에 주의해 주세요.

●javadoc태스크

 javadoc(을)를 생성하는 태스크로 , 겉(표)4의 인수를 취합니다.

표4 javadoc태스크의 인수
인수기능 필수인가?
(디폴트치)
packagenamesjavadoc(을)를 생성하고 싶은 패키지명YES
lib WEB-INF/lib 디렉토리에 포함하는jar파일. war태스크에 네스트 한 태그로서 포함하는

NO

classes WEB-INF/classes디렉토리에 포함하는 클래스 파일을 지정. war태스크에 네스트 한 태그로서 포함하는NO
sourcepathjava파일의 장소YES
destdir출력하는 디렉토리

YES

Windowtitle브라우저의 바에 표시하는 타이틀을 지정NO
Doctitle개요에 표시하는 타이틀을 지정NO
encoding Java파일의 인코딩NO (시스템의 인코딩)
docencoding 출력하는Javadoc의 인코딩NO (시스템의 인코딩)
excludes컴파일 대상으로부터 제외하고 싶은 파일의 리스트NO
bottomHTML파일의 맨 밑에 삽입하는 텍스트를 지정NO(저작권 정보등을 넣는데 이용)
Author 코드중의@author태그로 지정한 개발자명을 포함하는NO(false)
(true/false를 지정)

 javadoc(은)는 , 다음과 같이 실행합니다.

<javadoc sourcepath="src/java
    excludes="**/bak/*"
    encoding="Windows-31J"
    packagenames="*"
    Windowtitle="my application"
    doctitle="my application"
    docencoding="iso-2022-jp"
    bottom="<center>&copy Arege Building</center>"
    Author="true"
    destdir="api"/>

●echo태스크

 빌드중에 메세지를 표시할 수가 있습니다. echo(은)는 , 다음과 같이 사용합니다.

<echo message="This is echo message" />

 빌드 파일을 디버그 할 때에 프롭퍼티의 값이나 실행 경과를 표시하거나 빌드 방법의 표시 등에 이용하면(자) 편리합니다.

 

 일본어 이용시의 주의점

Ant을 일본어 환경에서 이용할 때에 몇개인가 주의해야 할 점이 있으므로 , 조금 말해 둡니다.

●빌드 파일의 인코딩을 지정하는 것

 빌드 파일의xml선언부에서 , 빌드 파일의 인코딩을 ,

<?xml version="1.0" encoding="Windows-31J"?>

과 같이encoding속성으로 지정할 필요가 있습니다. 이 예에서는 ,Windows-31J(MS932) 를 지정해 있습니다만 ,UNIX등 을 사용의 경우는 ,euc-jp 등에 바꾸어 주세요. 문자 코드가 지정되어 있지 않은 경우 , 빌드 파일 읽기시에 에러가 발생합니다. 덧붙여서 디폴트 인코딩은UTF-8이므로 ,UTF-8그리고 빌드 파일을 기술하면 ,encoding속성을 지정할 필요는 없습니다.

●javac,javadoc태스크의 인코딩을 지정하는 것

 원시 코드에 일본어가 포함되는 경우는 ,javac태스크 중(안)에서 다음과 같이 반드시 원시 코드의 인코딩을 지정하도록 해 주세요.

<javac encoding="Windows-31J"
    …

 이 기술을 실시하지 않아도 , 시스템 디폴트의 인코딩으로 원시 코드를 기술하고 있으면 문제 없게 컴파일 할 수 있습니다만 ,Windows위에서 작성한 코드를Linux위에서 컴파일 하는 등 , 디폴트의 캐릭터 세트가 다른 환경에서Ant를 실행하면(자) , 올바르고 컴파일 할 수 없게 됩니다. encoding(은)는 항상 지정하도록 해 둡시다. javadoc태스크의 경우는 , 다음과 같이 소스의 인코딩 , 출력HTML의 인코딩 , 로케일을 지정하도록(듯이) 합니다 (로케일을 지정하지 않으면 영어 환경에서javadoc를 이용하면(자) ,javadoc가 생성하는HTML이 영어가 될테니 주의해 주세요 ).

<javadoc
    encoding="Windows-31J"
    docencoding="iso-2022-jp"
    locale="ja"
    …

 이 예에서는 , 소스가Windows-31J,javadoc그리고 출력하는HTML파일은iso-2022-jp됩니다. 그리고 , 그 다른 태스크에서도 , 적당 인코딩을 지정하는 버릇을 붙여 두는 것이 좋을 것입니다.

 

COLUMN   파일 세트와 패턴

Ant을 이용할 때에 기억해 두면(자) 편리한 기능에 파일 세트와 패턴이 있습니다. 파일 세트는 그 이름대로 「파일의 모임」을 기술한 것입니다. fileset(은)는 ,java의 소스 ,class파일 등 , 어떠한 파일에서도 취급할 수가 있습니다만 , 특히 클래스 패스를 설정할 때jar파일의 집합을 정의하는데 편리합니다. 예를 들면 , 다음과 같이lib디렉토리아래에 컴파일시에 필요한jar파일이 있다고 합니다.

myproject/
lib/
commons-logging.jar
oro.jar
servlet.jar
ext/j2ee.jar

이 때 ,

<!-- 클래스 패스의 설정 -->
<path id="clspath">
<!-- lib디렉토리 이하의 것include으로 지정한 파일을clspath
에 포함한다. -->
<fileset dir="lib">
<!-- 모든jar파일을 클래스 패스에 포함하는 -->
<include name="*.jar"/>
</fileset>
</path>



<javac src="...">
<!--클래스 패스에clspath를 추가 -->
<classpath refid="clspath" />
</javac>

그렇다면 ,lib이하의 적색의jar파일(commons-logging.jar,oro.jar,servlet.jar) 에 대해서 , 간단하게 클래스 패스에 통할 수가 있습니다. Ant그럼 , 패턴으로 불리는 정규 표현을 간단하게 한 것을fileset태그 중(안)에서 이용할 수가 있어*는 ,0개 이상의 문자를 나타내는 패턴이므로 ,*.jar에 의해 커런트 디렉토리(여기에서는lib) 중의 확장자(extension)가jar인 파일 모든 것을 지정할 수 있게 됩니다. 그리고 ,

<fileset dir="lib">
<include name="**/*.jar">
</fileset>

와**를 이용하면(자) , 커런트 디렉토리 이하의 확장자(extension)가jar인 파일을 재귀적으로 찾아내 , 모든jar을 지정할 수가 있습니다. 상기의 예에서는 ,j2ee.jar을 포함한 적색 , 청색 모든jar파일을 포함할 수가 있습니다.

 다음번은 , 응용편이라고 하는 것으로 ,Ant를 사용해 ,1개의Java코드로부터 간단하게EJB를 작성하는 방법을 소개합니다.

필자 프로필
오카모토 타카시(오카모토 타카시)

오카야마 대학 공학 연구과 수료 후 , (주)NTT데이터에 입사. 캐릭터 레코그네이션 소프트웨어의 연구개발을 거쳐 ,Web서비스 관련의 연구개발에 종사한다. 개인에서는 ,Debian GNU/Linux이 뛰어난 메인트넌스성과 다른 디스트리뷰션을 압도하는 패키지수에 끌리고Debian를 사용하기 시작한 것을 계기로 ,Debian프로젝트의 개발자가 된다. Debian프로젝트의Stefan Gybas,Ola Lundqvist들과 함께 ,Java서포트의 강화를 실시한다. Jakarta에 관해서는 ,Tomcat/JMeter/ORO/Lucene등의 국제화/일본어에의 로컬라이즈 ,Ant의Kaffe VM대응등을 실시하고 있다. 「Jakarta프로젝트 철저 공략」(기술 평론사) , 「WEB+DB PRESS」(기술 평론사) , 「Java World」(IDG재팬) , 「JAVA Developer」(소프트뱅크 퍼블리싱) 등으로 집필 활동을 실시하고 있다.

Ja-Jakarta Project에 붙어
Ja-Jakarta프로젝트에서는 ,Jakarta프로젝트의 문서의 일역이나 프로덕트의 국제화/일본어화등을 실시하고 있다
. 현재 , 프로젝트의 멤버를 모집중. Ja-Jakarta프로젝트의 활동에 참가하자고 하는 (분)편은 ,
「Ja-Jakarta프로젝트에의 참가 방법」 (http://www.ingrid.org/jajakarta/site/getinvolved.html) 을 참조.