2011년 6월 13일 월요일

Apache Ant 설치와 사용 - 2

Chapter 2 Ant 사용하기


PLT 2.1 빌드파일
Ant의 빌드파일은 XML로 쓰여졌습니다. 각 빌드파일은, 하나의 프로젝트와 하나 이상의(기본값의) 타겟을 가지고 있습니다. 타겟은 태스크 요소로 이루어져 있습니다. 빌드파일의 각각의 태스크 요소는 id 속성을 가질 수가 있어 나중에 이것에게 준 값에 의해 참조되어 집니다. 이 값은 유일한 값이 됩니다. 다음의 빌드파일의 예를 보여줍니다.
Sample – build.xml
<?xml version = '1.0' encoding = 'EUC-KR'?>
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<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"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- 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"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>


프로젝트(Projects)
프로젝트는 다음의 3개의 속성을 가지고 있습니다:
속성
(attribute)
설명(Description)필수
(Required)
name
프로젝트의 이름.
아니오.
default
타겟이 지정되지 않을 때에 사용하는 디폴트 타겟.
네.
basedir
모든 패스(path)의 처리가 행해지는 기본디렉토리. 이 속성은, "basedir" 프로퍼티를 설정하기 전에 오버라이든 해야 합니다. 이렇게 이루어졌을 때, 프로젝트 태그에서 생략되지 않을 것입니다.속성(attribute)과 프로퍼티(property)의 양쪽 모두에서 지정되어 있지 않았다면, 빌드파일의 상위디렉토리가 사용됩니다.
아니오.


필요에 따라서, 프로젝트의 설명을 탑-레벨의 <description> 요소에 추가할 수 있습니다. 각 프로젝트는 하나 이상의 타겟을 정의합니다. 하나의 타겟은 실행하고 싶은 태스크의 집합입니다. Ant를 기동했을 때에, 어느 타겟을 실행할 것인가를 선택할 수가 있습니다. 타겟을 지정하지 않는 경우에는, 그 프로젝트의 기본값이 사용됩니다.

타겟(Targets)
타겟(target)은, 다른 여러 타겟에 의존할 수 있습니다. 예를 들면, 컴파일을 위한 타겟과 배포물을 작성하기 위한 타겟을 가질 수가 있습니다. 최초로 컴파일이 끝나 있으면, 오직 배포물을 빌드 할 수 있습니다. 이것은, 배포 타겟은 컴파일 타겟에 의존하고 있다고 볼 수 있습니다. Ant는, 이러한 의존성을 해결합니다. 그러나, 주의해야 할 것은, Ant의 depends 속성은 어느 타겟이 실행되어야 할 것인가의 순서를 지정할 뿐이라는 겁니다 - 만약, 어느 타겟이 실행되지 않는(실행의 필요가 없는) 것이라면, 이것에 의존하고 있는 다른 타겟이 실행되는데 영향을 주지 않습니다. Ant는 depends 속성의 타겟을, 보이는 순서(왼쪽에서 오른쪽으로) 실행하려고 합니다. 먼저 출현하는 타겟을 의존하고 있는 경우에는, 그것을 먼저 실행 시킬 수 있다는 것을 기억하십시요.

<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>

타겟 D를 실행할 때 depends 속성으로부터, 최초로 타겟 C를, 다음에 B를, 그리고 A를 실행해야 한다고 생각하고 있을 것입니다. 아닙니다! C는 B에 의존해, B는 A에 의존하고 있으므로, 최초로 A, 다음에 B, 다음에 C, 그리고 마지막에 D를 실행해야 합니다. 타겟은 하나 이상의 타겟이 의존하고 있는 경우 조차도 1회만 실행하려고 합니다. 타겟은 어느 프로퍼티가 설정되어 있는 (또는 되어 있지 않은) 경우에, 그것을 실행하는 능력도 가지고 있습니다. 예를 들어, 이것에 의해, 시스템 상태(Java의 버젼, OS, 커맨드-라인 프로퍼티 정의, 등...) 에 의존한 빌드 프로세스를 보다 잘 제어할 수 있게 됩니다. 타겟이 이 프로퍼티를 검출할 수 있도록 하기 위해서는, 타겟이 반응해야 하는 프로퍼티의 이름을 가지는 if (또는 unless) 속성을 추가해야 합니다. 예를 들면:

<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>

최초의 예에서는, 만약 module-A-present 프로퍼티가 설정되어 있다면, 타겟이 실행됩니다. 두번째의 예에서는, 만약 module-A-present 프로퍼티가 설정되어 있는 경우에는, 타겟은 실행되지 않습니다.
만약 ifunless 속성이 존재하지 않는다면, 타겟은 항상 실행될 겁니다. 추가적인 description 속성은 타겟에 붙는 간단한 설명을 제공하기 위해 사용할 수가 있습니다. 모든 다른 타겟이 의존하고 있는, 이른바 초기화(initialization) 타겟안에 tstamp 태스크를 배치하는 것은 좋은 연습이 되겠지요. 타겟이 다른 타겟의 의존 리스트 중에서 항상 가장 우선인 것을 확인해 주세요. 타겟은 다음과 같은 속성을 가지고 있습니다:
속성
(attribute)
설명(Description)
필수
(Required)
name
타겟의 이름.
depends
이 타겟이 의존하는, 타겟의 이름의 콤마로 단락지어진 리스트
아니오
if
이 타겟을 실행하기 위해 설정되어야만 하는 프로퍼티의 이름.
아니오
unless
이 타겟을 실행하기 위해서 설정되어선 안 되는 프로퍼티의 이름.
아니오
description
이 타겟의 기능에 대한 간단한 설명.
아니오


타겟의 이름은 XML 파일의 인코딩으로서 허용되는 임의의 알파벳과 숫자의 집합입니다. 이 집합에는 콤마 ","나 스페이스 " "가 그렇듯이 공문자열 ""도 포함됩니다. Ant의 장래의 버전에서는 이것들이 모든 혼란의 원인이 되어 지원되지 않기 때문에, 이것들을 사용하는 것은 피해 주세요. IDE에서 보통 지원되지 않는 타겟명이나 스페이스를 포함한 타겟명의 지원 상황은 IDE에 따라 다릅니다. "-restart" 처럼 하이픈(-)으로 시작되는 타겟은 올바르므로, 커맨드 라인에서 직접 불릴 수 없는 타겟 이름을 사용할 수가 있습니다.

태스크(Tasks)
태스크란, 실행 가능한 코드의 부분입니다. 태스크는, 복수의 속성(또는, 선택한 인수)을 가질 수가 있습니다. 속성의 값은 프로퍼티에 대한 참조를 포함할 수가 있습니다. 이 참조는 태스크가 실행되기 전에 해결됩니다. 태스크는 다음과 같은 구조를 가지고 있습니다:

<name attribute1="value1" attribute2="value2" ... />

name 은 태스크의 이름이며, attributeN 는 속성명, 그리고 valueN 는 이 속성의 값입니다.
built-in 태스크나, optional 태스크의 집합이 있습니다만, 독자적인 태스크 작성하기도 매우 간단합니다. 모든 태스크는 task name 속성을 가지고 있습니다. 이 속성의 값은 Ant에 의해 생성되는 로깅 메세지로 사용됩니다. 태스크에는 id 속성을 할당할 수가 있습니다:

<taskname id="taskID" ... />

여기서 taskname 는 태스크의 이름이고, taskID 는 이 태스크의 독특한 식별자입니다. 이 이름을 매개로 한 스크립트 또는 다른 태스크의 태스크 오브젝트를 참조할 수가 있습니다. 예를 들면, 이 스크립트 안에서:

<script ... >
task1.setFoo("bar");
</script>

특정의 태스크 인스턴스의 foo 속성을 설정할 수가 있습니다. 다른 태스크(Java로 쓰여진)의 경우에는, project.getReference("task1")를 통해 이 인스턴스에 액세스 할 수 있습니다.
주의
만약 "task1" 이 아직 실행되지 않았다면, 그것은 아직 구성되어 있지 않습니다. (예를 들면, 아직 속성은 설정되어 있지 않습니다) 만약 다음에 구성된다면, 인스턴스에 대해 실행됐던 것은 덮어쓰기됩니다. 장래의 버전의 Ant는 아마 이 행동에 대해서 하위-호환성을 가지지 않을 것입니다. 아마도 태스크의 인스턴스는 전혀 존재하지 않고, proxies 만이 있을 것 입니다.


프로퍼티(Properties)
프로젝트는 프로퍼티의 집합을 가질 수가 있습니다. 이것들은 property 태스크에 의해 빌드파일 중에서 설정될 수도 있고, Ant 의 밖에서 설정될 수도 있습니다. 프로퍼티는, 이름(name)과 값(value)을 가지고 있습니다. 이름은 대·소문자를 구별합니다. 프로퍼티는 태스크의 속성의 값으로 해서 사용할 수가 있습니다. 이것은 속성의 값 중에서 "${" 와 "}" 의 사이에 프로퍼티명을 쓰는 것으로 사용 가능합니다. 예를 들면, 값 "build" 를 가지는 "builddir" 라고 하는 프로퍼티가 있다면, 속성 내에서 "${builddir}/classes" 와 같이 사용할 수가 있습니다. 이것은, 실행시에, "build/classes" 로서 처리됩니다.

내장 프로퍼티
Ant는 모든 시스템 프로퍼티에 대해서 <property> 태스크를 사용해 정의되어 있는 것 같이 액세스 할 수가 있습니다. 예를 들어, ${os.name} 는, 운영체제의 이름에 전개됩니다.
시스템 프로퍼티의 리스트에 대해서는 the Javadoc of System.getProperties를 참조하세요.
게다가, Ant에는 다음과 같은 내장 프로퍼티가 있습니다:

basedir 프로젝트의 기본디렉토리의 절대경로
(<project> 의 기본디렉토리 속성으로 설정된다) .
ant.file 빌드 파일의 절대경로.
ant.version Ant의 버젼
ant.project.name 현재 실행하고 있는 프로젝트의 이름;
<project> 의 이름(name) 속성으로 설정되어 있습니다.
ant.java.version Ant가 검출한 JVM의 버젼;
현재는 "1.1","1.2","1.3","1.4" 의 값을 가질 수가 있습니다.

PLT 2.2 Ant 실행
Ant 실행 옵션
ant [options] [target [target2 [target3] ...]]
Options :
-help 도움말을 보여준다.
-projecthelp 프로젝트에 필요한 도움을 보여준다
-version 현재 ant 버전을 보여준다
-quiet build하는 과정을 디스플레이 하지 않는다.
-verbose verbose모드를 실시한다.
-debug debugging 정보를 보여준다.
-emacs 로깅 정보를 만들어낸다
-logfile file 주어진 파일로 로그를 출력한다.
-logger classname 클래스를 이용하여 로깅을 수행한다.
-listener classname 리스너클래스를 추가한다.
-buildfile file 대상 build파일을 정의한다.
-D<property>=<value> build설정에 필요한 프로퍼티를 사용한다.
-find file 루트로부터 buildfile을 찾아서 실행한다.


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

Java로 Ant 실행하기
Ant 를 스스로 컴파일시켜 인스톨 했을 경우, Ant 는 다음과 같이 시작할 수 있습니다:
java -Dant.home=c:ant org.apache.tools.ant.Main [options] [target]
다음의 지시는 실제로 ant 커맨드와 완전히 같습니다. 옵션과 타겟은 ant 커맨드에 의해 Ant 를 실행할 때와 같습니다. 이 예에서는 클래스 패스에 포함하는 것이 설정되어 있다고 가정합니다:
ant.jar
XML parser 용의 jars/classes
JDK 에 필요한 jar/zip 파일

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...