이번 포스팅에서는 Ant를 이용한 어플리케이션 빌드 자동화에 대해 알아보기
1. 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는 태스크명을 나타내며, srcdir과 destdir, classpath는 각각 javac 태스크에서 사용되는 속성을 나타냄.
그리고 각 속성의 값 중, "${"로 시작하고 "}"로 끝나는 것이 있는데 이는 프로퍼티를 나타내는 것으로서 "${"와 "}" 사이에 있는 문자열의 프로퍼티의 이름
4. 프로퍼티(property)
프로젝트를 진행하다보면 다양한 프로퍼티를 사용하게 됨. 컴파일할 소스 코드의 위치, 컴파일된 클래스 파일을 저장할 디렉토리, 압축한 파일을 위치시킬 디렉토리 등 유연한 개발을 위해서는 다양한 프로퍼티의 사용이 필수적이라 할 수 있음.
Ant는 이처럼 빌드 과정에서 사용되는 다양한 프로퍼티를 지정할 수 있도록 하고 있으며, 또한 몇몇 개의 빌트인 프로퍼티를 제공하고 있음.
프로퍼티의 지정은 property 태스크를 통해서 할 수 있음.
속성 | 설명 | 필수여부 |
name |
설정할 프로퍼티의 이름 |
X |
value |
프로퍼티의 값 |
name 속성을 사용할 경우 세 속성중의 하나를 지정해야 함 |
location |
-프로퍼티를 주어진 파일의 절대 파일명으로 지정 |
|
refid |
다른 곳에서 정의된 객체를 참조 |
|
resource |
프로퍼티 파일을 나타내는 자원의 이름 |
name 속성을 사용하지 않을 때 이 세 속성중의 한 개를 사용해야 함 |
file |
프로퍼티 파일의 파일 이름 |
|
environment |
-환경 변수를 읽을 때 사용할 접두어 |
|
classpath |
자원을 검색할 때 사용할 클래스패스 |
X |
classpathref |
다른 곳에서 정의된 PATH에 대한 참조로서 주어진 자원을 검색할 때 사용할 클래스패스 |
X |
[참조] https://javacan.tistory.com/entry/60
'LANGUAGE > JAVA' 카테고리의 다른 글
[Java] JSP 표현식, 선언문, 주석, 스크립틀릿 (0) | 2021.01.28 |
---|---|
[Java] JSP 개념, 동작원리 (0) | 2021.01.27 |
[Java] java security 관련 오류 정리 (0) | 2021.01.27 |
[Java] JNDI (Java Naming and Directory Interface) (0) | 2021.01.19 |
[Java] Java Servlet 서블릿 (0) | 2021.01.19 |