LANGUAGE/JAVA

[Java] Ant를 이용한 어플리케이션 빌드 자동화

보겸삼촌 2021. 1. 27. 12:54

이번 포스팅에서는 Ant를 이용한 어플리케이션 빌드 자동화에 대해 알아보기

1. Ant란,

자바 기반의 빌드툴로 리눅스의 make와 비슷한 기능을 제공하고 있음
하지만 Ant는 다음과 같은 면에서 make와 같은 쉘기반의 빌드툴과는 다름

 

 

Ant는 자바기반이기 때문에 플랫폼에 독립적으로 실행

복잡할 쉘 명령어 대신에 XML 기반의 설정 파일을 사용하기 때문에 작업을 설정하는 것이 복잡하지 않음

미리 정의된 태스크(Task)를 사용하여 매우 쉽고 빠르게 배치 작업을 설정할 수 있음

새로운 태스크의 추가를 통해서 처리 가능한 배치 작업의 확장이 가능

 

 

 

 플랫폼에 독립적이기 때문에 어느 운영체제건 같은 프로젝트를 진행할 수 있게 되며, 쉘 스크립트와 비교할 수 없을 정도로 간단한 XML 기반의 빌드 설정 파일을 사용하여 미리 정의된 빌트인 태스크(Task)를 설정함으로써 매우 간단하고 쉽게 배치 작업을 지정할 수 있도록 해 줌. 태스크는 Ant를 통해서 처리하고자 하는 작업을 나타내는 것으로 파일 복사하는 태스크, 소스 코드 컴파일하는 태스크, Javadoc API를 생성해주는 태스크 등 다양한 태스크가 미리 정의되어 있음

 

 

 

 

2. 사용방법

 

 make를 사용하기 위해서 makefile을 알맞게 작성해야 하듯이 Ant를 올바르게 활용하기 위해서는 Ant가 사용할 빌드 파일을 알맞게 작성해야 함

 

 Ant의 빌드 파일은 XML 문서의 구조를 갖고 있으며 Ant가 작업을 수행할 프로젝트에 대한 정보를 담고 있으며, 다음과 같은 형태를 취하고 있음

  <project name="프로젝트이름" default="기본타겟이름" basedir="." >
    <target name="타겟이름">
      <property name="프로퍼티이름1" value="프로퍼티값1"/>
      <property name="프로퍼티이름2" value="프로퍼티값2"/>
    </target>
    <target name="타겟이름1">
      <태스크명/>
      <태스크명1 dir="${build}"/>
      <property name="프로퍼티이름3" value="프로퍼티값3"/>
    </target>
    <target name="타겟이름2" depends="타겟이름1">
      <태스크명2 속성1="값1" 속성2="값2"/>
    </target>
  </project>

 

 

 

  2.1. project 태그

 

    : 빌드 파일의 루트 태그로서 프로젝트 자체를 정의해준다. 모든 빌드 파일은 한 개의 project 태그를 가짐

속성 설명 필수여부
name 프로젝트의 이름 X
default ant.bat 파일을 실행할 때 타겟이 지정되지 않았을 때 기본적으로 사용할 타겟 O
basedir 경로 계산을 할 때, 사용할 기본 디렉토리, basedir 프로퍼티를 지정했을 경우, 그 값을 이 속성에서 지정한 값으로 대체한다.만약 이 속성도 지정하지 않고 basedir 프로퍼티도 지정하지 않았을 경우에는 빌드 파일이 위치하는 디렉토리를 기본 디렉토리로 사용한다. X

 

 

 

  2.2. target 태그

 

    : project 태그에 포함되며, 실제로 프로젝트가 수행할 작업(태스크)을 지정

<target name="타겟이름1">
      <태스크명/>
      <태스크명1 dir="${build}"/>
      <property name="프로퍼티이름3" value="프로퍼티값3"/>
</target>

 

 하나의 project 태그에는 여러 개의 target 태그를 포함할 수 있음. , 실제 작업의 처리는 target 태그 내에 명시되어 있는 태스크를 통해서 이루어지는 것.

 

 

 

    2.2.1. target 의존 관계

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

 

 여러 개의 target 태그의 depends 속성이 같은 타겟의 이름을 값으로 가질 수 있으나 이에 상관없이 각각의 타겟은 오직 한 번만 실행됨.

 

 Ant의 빌드 파일에서는 프로퍼티를 사용할 수 있는데, <target> 타겟 태그는 if 속성을 사용하여 특정한 프로퍼티가 지정되어 있을 경우에만 작업을 수행하도록 할 수 있음.

 

 또한, unless 속성을 사용하여 프로퍼티가 지정되어 있지 않을 경우에만 작업을 수행하도록 할 수 있음.

 

 예를 들어, 테스트 단계와 배포판 생성 단계에서 각각 다른 태스크를 수행해야 할 경우 다음과 같이 "test" 프로퍼티를 사용할 수 있을 것

 

<target name="test" if="test" depends="compile" >
      ...
    </target>
    <target name="distribute" unless="test" depends="compile">
      ...
</target>

 

 

 <target> 태그는 그 타겟에 대한 설명을 description 속성을 통해서 할 수 있음. description 속성에 명시한 값은 ant.bat을 실행할 때 명령행 옵션인 -projecthelp를 통해서 볼 수 있음.

 

 

3. 태스크(Task)

 

 타켓이 각 수행할 작업간의 의존관계나 수행 조건 등을 표시한다면 태스크는 타켓 내에서 실제 수행할 작업을 나타냄 

 

 예를 들어, 여러분은 태스크를 통해서 소스 코드를 컴파일하고 파일을 복사/삭제하고 API 문서를 생성할 수 있음

 

 태스크 <target> 태그에 중첩되어 표시되며 다음과 같은 구조를 갖고 있음

  <태스크명 속성1="값1" 속성2="값2" ... />

 

 

 태스크는 이미 만들어져 있는 빌트인(built-in) 태스크를 사용할 수도 있고, 추가적으로 제공되는 옵션(optional) 태스크를 사용할 수도 있음. 또한 직접 작성한 태스크를 사용할 수도 있다.

 

 예를 들어, 빌트인 태스크인 javac를 사용하여 소스 코드를 컴파일 할 때는 다음과 같이 <target> 태그에 javac 태스크를 중첩시키면 됨.

 

<target name="compile" depends="init">
     <javac srcdir="${src}"
            destdir="${build}"
            classpath="jcorelogging.jar"  />
</target>

 

 

 위 코드에서 <javac src="${src}" ... /> 태그가 <target> 태그에 중첩되어 있는 것을 알 수 있는데, 이때 javac는 태스크명을 나타내며, srcdirdestdir, classpath는 각각 javac 태스크에서 사용되는 속성을 나타냄.

 

 그리고 각 속성의 값 중, "${"로 시작하고 "}"로 끝나는 것이 있는데 이는 프로퍼티를 나타내는 것으로서 "${""}" 사이에 있는 문자열의 프로퍼티의 이름

 

 

 

 

4. 프로퍼티(property)

 

 프로젝트를 진행하다보면 다양한 프로퍼티를 사용하게 됨. 컴파일할 소스 코드의 위치, 컴파일된 클래스 파일을 저장할 디렉토리, 압축한 파일을 위치시킬 디렉토리 등 유연한 개발을 위해서는 다양한 프로퍼티의 사용이 필수적이라 할 수 있음.

 

 Ant는 이처럼 빌드 과정에서 사용되는 다양한 프로퍼티를 지정할 수 있도록 하고 있으며, 또한 몇몇 개의 빌트인 프로퍼티를 제공하고 있음.

 

프로퍼티의 지정은 property 태스크를 통해서 할 수 있음.

속성 설명 필수여부
name

설정할 프로퍼티의 이름

X
value

프로퍼티의 값

name 속성을 사용할 경우 세 속성중의 하나를 지정해야 함

location

-프로퍼티를 주어진 파일의 절대 파일명으로 지정
-이 속성의 값이 절대 경로일 경우, '/''\'와 같은 구분자는 현재 플래폼에 알맞게 처리 
-절대 경로가 아닐 경우 프로젝트의 basedir에 상대적인 경로로 처리

 
refid

다른 곳에서 정의된 객체를 참조

 
resource

프로퍼티 파일을 나타내는 자원의 이름

name 속성을 사용하지 않을 때 이 세 속성중의 한 개를 사용해야 함

file

프로퍼티 파일의 파일 이름

 
environment

-환경 변수를 읽을 때 사용할 접두어 
-만약 environment="myenv"라고 지정했다면, OS에 종속적인 환경변수인 PATHTEMP와 같은 값을 "myenv.PATH""myenv.TEMP"와 같은 프로퍼티 이름을 사용하여 구할 수 있음

 
classpath

자원을 검색할 때 사용할 클래스패스

X
classpathref

다른 곳에서 정의된 PATH에 대한 참조로서 주어진 자원을 검색할 때 사용할 클래스패스

X

 

 

 

[참조] https://javacan.tistory.com/entry/60