Back-end/JAVA,Spring

[java build] ANT란? (feat. MAVEN과 차이점? )

cheersHena 2021. 8. 25. 23:40
반응형

Ant란?  주식개미아니고요..

자바 기반의 빌드툴로 리눅스의 make와 흡사한 기능 제공한다.

 

Ant는 자바 기반으로 플랫폼에 독립적으로 실행. - 운영체제에 구애받지 않고 프로젝트 진행가능.

복잡한 쉘 명령어 대신 xml기반의 기능 설정파일을 사용하기 때문에 작업 설정이 복잡하지 않다.

미리 정의된 Task를 사용하여 쉽고 빠르게 배치 작업을 설정할 수 있다.

새로운 Task의 추가를 통해 배치작업의 확장이 가능하다.

 

*Task는 Ant를 통해서 처리하고자 하는 작업을 나타내는것으로 파일복사 태스크, 소스코드 컴파일 태스크, Javadoc API생성 태스크 등 다양한 태스크가 미리 정의되어 있다.

 

Ant사용법

Ant의 빌드 파일은 xml 문서의 구조이며 Ant가 작업을 수행할 프로젝트에 대한 정보를 담고 있다.

다음과 같은 형태를 가지고 있음.

  <project name="프로젝트이름" default="기본타겟이름" basedir="." > <!--빌드파일의 루트태그.--> 
   
    <target name="타겟이름"> <!--실제 프로젝트가 수행할 작업(Task지정) -->
      <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>

위 코드에서 *태스크명n 태그는 target태그가 나타내는 대상이 수행할 작업을 나타내는 것으로 컴파일 태스크, jar압축 태스크 등 다양한 종류의 태스크가 미리 개발되어 있다. 

 

태그 설명 

1. <project>

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

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

 

 

2.<target>

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

 

*target태그의 의존관계.

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

여기서 최종 실행 타겟이 D인 경우, 타겟 D의 depends속성 값이 C,B,A 이므로 D를 실행하기 위해서는 C,B,A가 표기된 순서대로 수행되어야 함을 의미한다. 하지만 예제의 경우 타겟 C는 B에 의존하고 있고 B는 A에 의존하고 있기 때문에 C 실행 전에 B가 실행되어야 하고 B 실행 전 A가 수행 되어야만 한다. 

즉, 이 경우에는 의존에 의해 결론적으로 A > B > C > D 순으로 실행된다. 

 

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

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

예컨대 태스트 단계와 배포 생성 단계에서 각각 다른 태스크를 수행해야할 경우 다음과 같이 "test" 프로퍼티를 사용한다. 

*프로퍼티: 다른값과 연관된 어떠한 값. 

<target name="test" if="test" depends="compile" > <!--테스트용-->
      ...
    </target>
    <target name="distribute" unless="test" depends="compile"> <!--배포용-->
      ...
</target>

 

 

3.<task>

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

예컨대, 태스크를 통해 컴파일 , 파일 복사, 삭제, API문서 생성 등... 을 할 수 있다. 

 

태스크 구조 

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

태스크는 이미 만들어진 built-in 태스크, 추가제공 옵션 태스크, 직접작성한 태스크를 사용할 수도 있다. 

 

 예를 들어, 빌트인 태스크인 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 태스크에서 사용되는 속성을 나타냄.

각 속성의 값 중, ${ }는 프로퍼티를 나타내는 것으로서 "${"와 "}" 사이에 있는 문자열은 프로퍼티의 이름임. 

 

 

 

즉, 빌드 자동화를 위한 놈인데.... 여기서 의문점!!!!!!!!!!!!!!!!!

그렇다면..  

Ant와 Maven의 차이점은 뭐냐???

  ANT MAVEN
정의 Ant는 소프트웨어 빌드 프로세스를 자동화
하기위한 소프트웨어 도구
Maven은 소프트웨어 프로젝트 관리 및 이해 도구
주요업무 Apache Ant는 빌드 도구 Maven은 빌드 도구 그 이상이다. 
프로젝트 관리, 종속성 해결 등을 제공함. 
접근방식 Ant는 명령적 접근 방식을 사용한다.
프로그래머는 수행 할 조치를 Ant 빌드 파일 (build.xml)에 지정해야한다.
Maven은 선언적 접근 방식을 사용한다.
프로그래머는 pom.xml 파일을 사용하여 정의해야한다.
라이프사이클 없음 빌드 수명주기, 단계 및 목표가 있다.
디렉토리
레이아웃
없음 있음
재사용성 없음 플러그인으로 재사용 가능 

 

 

즉, 둘 다 빌드 및 배포 도구로 사용할 수 있으나 목적자체가 다르다.

Maven이나 Ant를 사용한다고 결정하는 것은 둘 중 하나를 선택하는 것이 아니다.

Ant는 여전히 복잡한 빌드에서 사용되고 있다. 현재 빌드가 변경이 잦은 과정을 포함하고 있거나 Maven 표준에 적용될 수 없는 특정 방법으로 특정 과정을 완료하기 위해 Ant 스크립트를 작성하고 있다면 메이븐에서는 이러한 스크립트를 여전히 사용할 수 있다.

Ant는 핵심 Maven 플러그인으로써 사용 가능하다. 수정된 Maven 플러그인은 Ant에 구현될 수 있으며, Maven 프로젝트는 Maven 프로젝토 생명주기안에서 Ant 스크립트를 실행하도록 설정하는 것이 가능하다.

반응형