메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

Jakarta Ant로 소프트웨어 설치하기

한빛미디어

|

2002-06-26

|

by HANBIT

13,755

저자: 에릭 M. 버크(Eric M. Burke), 역 이상훈

필자는 Ant, Xalan, Tomcat과 같은 도구들의 특정 버전을 포함하는 자바강좌를 개발하고 가르치고 있다. 대개 실습실 담당하는 관리자에게 각 도구를 설치하는 readme 파일을 제공하곤 했는데, 이런 접근은 종종 실패하는 경우가 있었다. 예를 든다면 강의 준비의 마지막에 새로운 버전의 Tomcat을 사용하기로 결정한 경우나, 관리자가 핵심 도구의 잘못된 버전을 설치한 경우이다.

필자의 동료인 마크 볼크만(Mark Volkmann)이 XML 강좌를 듣기 전에 소프트웨어를 설치하기 위해 어떻게 Ant를 사용하는지에 대해 얘기했을 때, 필자는 설치과정을 간단하게 하는 방법을 찾고 있었다. 이것은 매우 좋은 아이디어인 듯 했고 수강생에게 Ant를 소개하는 재미있는 방법이기도 했다. 다른 사람에게 대여섯 개의 오픈 소스 도구의 설치를 전담하는 것보다 몇 개의 ZIP 파일과 함께 간단한 스크립트를 수강생에게 제공할 수 있었다. 이 스크립트는 Ant의 "bootstrap(로딩?)" 버전이 될 수 있으며 Ant를 이용해서 나머지 도구들을 특정 디렉토리에 압축을 풀어둘 있었다.

이 기사는 마크의 소프트웨어 설치 스크립트의 수정본을 설명하고 있다. 필자는 여러분들이 Ant를 사용해서 다른 창조적인 작업을 유발할 수 있기를 바란다.

설정

설치 유틸리티는 다음과 같은 요구조건을 만족해야 한다.
  • 수강생의 PC에는 윈도우 NT나 그 이상의 OS가 동작하고 있어야 한다. 유닉스 설치 스크립트를 만드는 것이 쉬울지 모르나 모든 실습 PC는 윈도우를 운영하고 있다. 플랫폼 의존도는 Ant 빌드 파일보다는 초기 배치파일의 한계이다.
  • 각 수강생의 PC에는 J2SE SDK가 설치되어 있어야 한다. 초기 배치파일이 Ant 배포판의 로딩을 위해 jar 유틸리티를 사용하기 때문이다.
  • 수강생이 자신의 하드 드라이브로 파일을 복사할 수 있도록 강사는 네트워크 드라이브를 공유할 수 있어야 한다.
[그림 1]은 수강생에게 주어질 디렉토리 구조를 보여주고 있다. 수강생은 소프트웨어를 설치할 수 있도록 첫 번째 강좌에서 이 디렉토리 구조를 자신의 PC에 복사한다.


[그림 1] 디렉토리 구조

Ant 로딩하기

루트 디렉토리인 AdvServletJSP는 수강생이 실행하게 될 윈도우 배치파일을 담고 있다. 이 파일은 tools 디렉토리를 생성하고 명령을 이용하여 Ant 배포판을 jakarta-ant-1.4.1 디렉토리에 압축해제 한다. 다음으로 배치파일은 빌드파일로서 studentInstall.xml을 이용하여 Ant를 호출한다. 이제부터 이 모든 것을 포함하는 배치파일을 살펴보도록 하자.

예제 1. studentInstall.bat
@echo off
setlocal

:: 수강생은 이 배치파일을 실행한다. 이 배치파일은 Ant를 설치하고, 
:: Ant를 이용하여 패키지의 나머지를 설치한다.

:: 이 버전의 Ant에 한정되는 몇 가지 변수를 설정한다.
set ANT_ZIP=jakarta-ant-1.4.1-bin.zip
set ANT_OPT=jakarta-ant-1.4.1-optional.jar
set ANT_HOME=tools\jakarta-ant-1.4.1

if not exist tools mkdir tools

@echo Unzipping Ant distribution...
cd tools
jar -xf ../downloads/%ANT_ZIP%
cd ..

@echo Copying Ant"s optional tasks JAR file...
copy downloads\%ANT_OPT% %ANT_HOME%\lib

@echo Using Ant to install remaining packages...
set PATH=%ANT_HOME%\bin;%PATH%
ant -buildfile studentInstall.xml

endlocal
이 배치파일은 자체적으로도 충분한 설명을 하고 있다. 자바의 jar 명령을 사용해 Ant 배포판을 압축해제 한다. .jar 파일이 .zip 파일과 같은 포맷을 사용하기 때문에 작동한다. 일단 Ant의 .zip 파일이 압축해제 되면 배치파일은 jakarta-ant-1.4.1-optional.jar를 Ant의 lib 디렉토리에 복사한다.

jakarta-ant-1.4.1-optional.jar은 "선택적인" Ant 태스크를 위한 클래스 파일을 담고 있다. 여기에는 핵심 태스크에 상반되는 태스크가 선택적인 사항으로 고려되어야 하는 지에 대한 이유가 많다. 예를 들어 대다수의 선택적인 태스크는 아파치가 라이센스 제한으로 인해 배포되지 못하는 것처럼 서드파티(third-party)의 .jar 파일을 요구한다. 기타 다른 선택적인 태스크들은 Ant 핵심에 속하지 않는 모호한 기능을 다루어야 할지도 모른다. 하여튼 여러분은 ftp, junit와 다양한 EJB관련 태스크와 같은 유용한 태스크를 포함하는 선택적인 태스크를 종종 원하게 될 것이다.

Ant 빌드파일

선택적인 태스크 .jar 파일을 설치하고 나면, 배치파일은 빌드파일로서 studentInstall.xml을 이용하여 ant 명령을 호출한다. 이 빌드파일의 지시에 의거하여 Ant는 설치과정의 나머지 부분을 관장한다. 예제 2는 완전한 Ant 설치파일을 보여주고 있다.

예제 2. studentInstall.xml


  
  
  
  
  
  
  

  
    
    
  

  
    
  

  
    
  

  
    
  

  
    
      
    
    
      
    
    
      
    
    
      Unless you saw error messages, everything is now installed.
      You should set the following environment variables:
       TOMCAT_HOME=${tomcat_home}
       XALAN_HOME=${xalan_home}
       ANT_HOME=${ant_home}
    
  

  
    
  

Ant 프로젝트

Ant: The Definitive Guide
Ant 빌드파일은 잘 정의된(well-formed) XML 문서이어야만 한다. 물론 위의 예제에서도 예외는 없다. 각 빌드파일은 프로젝트명, 디폴트 타겟과 기본 디렉토리를 정의하는 루트 요소를 가지고 있다. 프로젝트 명은 문서화 목적으로 사용되므로 일반적으로 무언가를 서술하는 것을 원할 것이다. basedir 속성은 빌드파일 내의 경로들이 계산되는 곳에서 위치를 한정한다.

Ant 프로젝트는 하나 이상의 태스크를 번갈아 포함하는 하나 이상의 타겟을 포함한다. 이 트리구조는 Ant의 기본이기 때문에 타겟과 태스크에 대해 간단하게나마 다룰 것이다. 그렇지만 우선은 Ant 특성들(properties)부터 살펴보도록 하자.

특성들(properties)

studentInstall.xml은 다수의 특성을 정의한다. 이 특성을 이용해 모든 하드코딩된 파일명과 버전번호를 한 곳에서 유지할 수 있다. 새로운 도구가 출시되면 이 명칭들은 반드시 바뀌어야 하므로 꼭 알아두어야 할 특징이다. 특성은 이름/값을 갖는 문자열 쌍을 처리하는 태그를 이용해 정의된다.

  
  
  
  

이들 특성은 전역변수로 사용되므로 모든 Ant 타겟과 태스크 내에서 보인다. {$destdir}를 참조했을 때 보이는 것처럼 ${prop_name} 문법을 이용하여 특성을 참조할 수 있다. 특성은 한 번 정의되면 변경될 수 없는 상수들이다. 아마도 Ant 2.0에서 이 제약이 바뀔지 몰라도 현재는 그 특성이 변하지 않는 것으로 알아두자.

여기서 정의한 모든 특성은 타겟 수준 요소이므로 어떠한 타겟 빌드가 수행되기 전에 정의되어야 한다. 타겟이 수행될 때까지 특성이 정의되지 않은 경우에 대비해서 타겟 내에서 특성을 정의할 수도 있다. 타겟 내에서 정의된 특성이라고 해도, 일단 특성이 정의되고 나면 전역 변수로서 사용된다.

타겟

Ant 타겟은 빌드파일의 사용자 접근성을 정의한다. 모든 타겟은 명명되어지고 서로에 대해서 의존성을 가질 수 있다.

명령행에서 타겟명을 명시하는 것으로 Ant를 사용할 수 있다. 여기서는 어떻게 installTomcat 타겟을 호출하는지 보도록 하자.
ant -buildfile studentInstall.xml installTomcat
모든 타겟명의 리스트를 보려면 ant -projecthelp를 입력하면 된다. 또한 다중 타겟을 다음과 같은 하나의 명령으로 수행할 수도 있다.
ant -buildfile studentInstall.xml uninstall installXalan
마지막으로 디폴트 타겟을 수행하기 위해 단순하게 ant를 입력할 수 있다. 여기서는 installAll이 디폴트 타겟이고 태그에 명시되어 있다. 다른 Ant 옵션들은 ant -help를 이용해서 살펴볼 수 있다.

타겟 의존성

예제 빌드파일에서 볼 수 있듯이 타겟은 다른 타겟에 대해 의존성을 가질 수 있다. 예를 들어 prepare 타겟을 보자.

이 의존성 때문에 init 타겟은 prepare 타겟보다 먼저 수행된다. 빌드파일 전반에 이러한 의존성 메커니즘을 이용하여 바른 순서대로 작업이 완료되도록 한다. 예를 들어 prepare 타겟은 다른 태스크가 진행되기 전에 산출물 디렉토리가 생성되었음을 보장한다.

타겟 의존성의 대안으로 antcall 태스크를 이용하여 다른 타겟을 직접적으로 호출할 수 있게 빌드파일을 구성할 수 있다. 다른 빌드파일에서 타겟을 호출하려면 ant 태스크를 사용한다.

다른 타겟 속성들

studentInstall.xml을 돌이켜 보면 installTomcatinstallXalan 타겟이 unless 속성을 사용한다는 것을 알 수 있을 것이다. 이 unless 속성은 정의된 특성이 설정되지 않은 한 타겟 내의 태스크가 수행되도록 보장한다. 여기서는 수강생이 이미 필요한 도구들의 압축해제를 했는지 그 여부를 지시하기 위해 haveTomcathaveXalan 특성이 사용되었다. 이 unless 속성은 반복적인 파일의 압축해제를 피하기 때문에 성능을 향상시킨다. 또한 Ant는 if 속성을 제공하므로써 이 if 속성이 설정된 경우에만 타겟을 실행하도록 제한할 수 있다.

이 외에도 타겟은 description 속성을 가질 수도 있다. 여러분이 ant -buildfile studentInstall.xml -projecthelp를 입력했을 때 Ant는 모든 타겟 리스트를 출력한다. 이 작업은 타겟이 description 속성을 가지고 있는지 없는지에 따라서 달라진다. description을 가진 타겟은 리스트 앞에 "Main targets"으로 표시된다. 반면 description이 없는 타겟은 "Subtargets"로 분류된다. 주 타겟과 하부 타겟의 구분은 순전히 문서화 목적을 위한 것이다. 일반적인 원칙은 사용자가 직접 대응하여 사용하기 원하는 타겟들을 위해서 description을 리스트하는 것이다. 주 타겟에 종속적인 것으로 공용으로 리스트되는 다른 타겟들은 이러한 description을 가져서는 안 된다.

태스크 (task)

빌드파일의 역할은 아니지만 태스크에 대한 얘기를 하지 않고서는 Ant에 대한 논의가 완결될 수 없다. Ant는 소스코드 컴파일, 파일 압축해제, 파일 복사, .war 파일 생성 및 사운드 파일 연주를 포함하는 100개 이상의 태스크를 초과하는 작업을 포함하여 적재될 수 있다.

Ant 태스크들은 자바 클래스로 구현되고 XML 태그를 이용하여 빌드파일 내에 표현된다. Ant는 XML 파일을 파싱하고 난 후 자바 리플렉션(Java reflection)을 이용하여 각 자바 태스크 오브젝트에 대해 어떤 메소드를 호출해야 하는지를 해석한다. 모든 태스크들은 자바 클래스를 이용하여 구현되었기 때문에 여러분은 자신만의 태스크를 작성할 수 있으며 Ant의 기능도 확장할 수 있다. 이제 studentInstall.xml에서 사용된 태스크들을 살펴보자.

Available

available(가용성) 태스크는 다양한 자원존재 여부를 결정하는데 사용된다. studentInstall.xml에서는 제품이 이미 설치되어있을 경우 available 특성을 설정한다.

  
  

installTomcatinstallXalan 타겟에 보여진 대로 이 특성은 태스크 수행 필요 여부를 제어한다.

available 태스크는 또한 클래스패스에 자바 클래스파일을 사용할 수 있는지 결정하는 데에도 사용된다. 특히 이것은 특정 버전의 API가 존재하는지를 판단할 때 아주 유용하다. 만약 JDK 1.4나 그 이후의 버전이 사용되고 있는지 그 여부를 여기에서 결정할 수 있다.

javax.swing.Spring은 JDK 1.4에 추가되었기 때문에 정상적으로 동작한다. 만약 Ant를 예전 JDK와 사용한다면 이 jdk1.4.present 특성은 설정되지 않을 것이다.

mkdir

mkdir 태스크는 설명하기 쉽다.

  

이미 디렉토리가 없는 경우 mkdir은 디렉토리를 생성한다. 이 경로는 Ant 프로젝트의 기본 디렉토리와 관련되어 있는 태그에서 지정된 경로이다. mkdir와 같이 간단한 태스크는 많은 일을 수행하지는 않지만 자바에 의해 지원되는 모든 플랫폼에서 사용할 수 있다는 점이 흥미롭다. 이것은 같은 빌드파일이 유닉스, 윈도우 혹은 다른 플랫폼에서도 똑같이 동작한다는 것을 의미한다. 이것은 copy, delete, 그리고 move와 같은 다른 파일 시스템 태스크에서도 똑같이 성립한다.

unzip

unzip 태스크는 지정된 디렉토리에 .zip 압축을 해제한다. Xalan과 Tomcat을 목적 디렉토리에 압축해제 하기위해 이 태스크를 사용해보자. 앞서 기술한대로 이 파일들은 이미 압축해제 되었는지를 지시하는 특성이 설정되지 않았을 경우 압축해제 된다.

  

pathconvert

pathconvert 태스크는 Ant 경로를 플랫폼 특정 경로로 변환한다. 윈도우에서는 / 문자를 \로 변경하는 것, 드라이브 문자를 패스에 추가하는 것, 디렉토리 구분자를 ; 문자로 변경하는 것을 의미한다. 일단 경로가 플랫폼 특정 형태로 변환되었으면 Ant 특성으로 할당된다. 이 특성은 추후에 대개 ${propname} 문법을 이용하여 빌드파일에서 참조될 수 있다.

이 글에서 설명되는 빌드파일은 echo 태스크와 함께 pathconvert를 사용하여 수강생에게 어떤 환경변수가 설정되어야 하는지를 알려주고 있다. 여기에서 pathconvert${destdir.tomcat} 경로를 어떻게 윈도우 특정 경로로 변환하는지 살펴보자.

  

이 태스크가 실행되고 나면 tomcat_home 속성은 C:\AdvServletJSP\tools\jakarta-tomcat-4.0.3과 같은 경로를 담고 있을 것이다.

echo

echo 태스크는 택스트를 System.out이나 파일로 쓰는 일을 한다. 여기서는 pathconvert 태스크의 결과를 콘솔에 표시하는데 사용했다.

  Unless you saw error messages, everything is now installed.
  You should set the following environment variables:
      TOMCAT_HOME=${tomcat_home}
      XALAN_HOME=${xalan_home}
      ANT_HOME=${ant_home}

delete

deletestudentInstall.xml에서 사용되는 마지막 태스크로 수행하는 일은 파일이나 디렉토리를 삭제하는 것이다. 대부분의 빌드파일은 모든 생성된 파일을 제거하는 기능을 제공하고 여기서도 예외는 없다.

  

여기 보여진 폼에서는 파일과 디렉토리를 포함하는 전체 디렉토리를 삭제하는 작업을 수행한다. 이것은 매우 위험한 작업이므로 주의를 기울여서 사용해야 한다. 만약 잘못된 디렉토리를 지정했다면 모든 프로젝트를 실수로 삭제하게 될 것이고 이 작업은 복구될 수 없으므로 굉장히 위험하다. 윈도우에서 이 태스크는 파일을 휴지통으로 보내지 않고 삭제한다.

문법을 수정해서 각각의 파일을 삭제할 수도 있다.

하지만 다음과 같은 일은 하지 않도록 하자.


이것은 모든 파일과 디렉토리를 포함하는 전체 reports 디렉토리를 삭제할 것이다. delete 태스크를 얼마나 주의 깊게 사용해야 하는지를 보여주는 좋은 예다. 무엇이 지워질지 전혀 확실하지 않다면 앞서 installAll 타겟에서 보여진대로 태스크와 를 사용하여 디렉토리를 먼저 출력해보는 것도 좋을 것이다. 빌드파일이 정확한 디렉토리를 지시하는 것으로 확인되었다면 delete 태스크를 추가해도 된다.

개선을 위한 아이디어

studentInstall.xml은 간단한 빌드파일로서, Ant 개념을 수강생에게 쉽게 소개하기 위해 제공되었다. 하지만 실제적인 관점에서는 디렉토리에 파일을 압축해제 하는 것 정도 밖에 되지 않는다. 자바의 jar 유틸리티가 .zip 파일을 압축해제 할 수 있기 때문에 간단한 배치파일을 이용해서 Tomcat과 Xalan을 압축해제 할 수도 있었다. 하지만 Ant를 이용하는 것이 더 좋다고 생각되는 이유는 배치파일로서는 처리할 수 없는 모든 종류의 보다 개선된 작업을 수행할 수 있기 때문이다.

.zip 파일이 아닌 다른 것을 설치하려고 하는 때가 있을 것이고 Ant는 .zip, .jar, .war 파일 외에도 .tar 파일과 GZip 파일을 압축해제 할 수 있다. 이러한 작업은 유닉스 플랫폼에서는 쉽게 수행될 수 있으나 윈도우에서는 그렇지 않다. 그렇지만Ant는 이러한 포멧에 대해 untargunzip 태스크를 이용하여 쉽게 작업을 수행할 수 있다.

다음으로 논리적인 개선은 javac 태스크를 이용하여 모든 수강생의 예제 프로그램을 컴파일 하는 것이다. 코드를 컴파일 하는 것은 Ant를 사용하는 주된 이유 중에 하나로서 이 기능을 추가하는 것이 논리에 부합한다. 이 기사에서 보여진 studentInstall.xml은 단순히 Tomcat과 Xalan을 설치한 것이지만, 수강생을 위한 예제 코드를 포함하고 있는 .zip 파일을 설치하는 것으로 가정한다면 그 코드를 다음과 같이 컴파일 할 수 있을 것이다.

  

installAll 타겟의 의존성으로 인해 빌드파일은 이 예제를 컴파일 하기 전에 모든 것이 설치되었는지를 확인한다. installTomcatinstallXalan 타겟은 unless 속성을 사용하기 때문에 모든 소프트웨어가 이미 설치되어있지 않다면 아무런 작업도 수행하지 않는다. 이것은 빌드파일이 아주 빨리 작업을 수행할 수 있도록 해준다. javac 태스크 또한 컴파일에 대해서는 매우 지능적이기 때문에 파일이 이미 컴파일 되어 있다면 재컴파일 하지 않는다.

코드를 컴파일 하고 나면 Ant의 junit 태스크로 단위 테스트를 수행할 수도 있다.

  
    
  
  

개선안의 마지막 한 가지는 ftp 태스크를 이용하여 소프트웨어를 다운로드 하는 것이다. 이것은 정말 참신한 기능으로 모든 .zip 파일을 수강생의 PC로 배포하는 일을 덜어준다. 대신 Ant 빌드파일을 실행함으로써 FTP를 이용하여 적절한 파일을 다운로드 받게 한다. 그러나 다운로드 시간이 많이 걸릴 수 있고 실습실에 네트워크 연결이 미덥지 못 할 수도 있기 때문에 필자는 이 작업을 실제적으로는 사용하지 않을지도 모른다.

맺음말

필자는 실습이 Ant와 같은 도구를 익히는데 가장 좋은 방법이라고 믿고 있다. 필자 자신도 make 파일에 실망한 결과 Ant를 배우게 되었다. 필자의 원래 빌드파일은 코드를 컴파일 하는 것 이상도 이하도 아니었지만 빠른 시간에 CVS에서 코드를 체크아웃하고, 단위 테스트를 수행하며, .jar 파일을 작성하고, 서블릿 컨테이너에 소프트웨어를 배치하는 도구가 되었다. Ant는 광대하고 다양한 종류의 독자적인 도구들을 집중된 개발환경으로 통합하게 해주는 깔끔한 기술이다.

Ant의 유연성은 소프트웨어를 설치하는 것과 같은 다른 작업에도 사용될 수 있을 것이다. 코드를 컴파일 하는 것과는 또 다른 프로젝트에 Ant를 사용해보기 바란다.

참고할만한 자료들 에릭 M. 버크(Eric M. Burke)는 Object Computing, Inc의 선임 소프트웨어 엔지니어로 Servlets, Swing, XML, XSLT, EJB, CORBA를 심도있게 사용하는 프로젝트의 리더로 활동하고 있다.
TAG :
댓글 입력
자료실

최근 본 상품0