'ant'에 해당되는 글 1건

  1. 2014.04.15 Maven에 대해 알아보자 #2

오늘은 저번포스팅에 이어  Maven 에 대해 알아보겠다.

이 내용은  O'Reilly Media - Maven: The Definitive Guide를 번역한 내용을 토대로 한다.


Maven과 Ant 중 어떤 것이 더 나은가는 논쟁거리가 되고 있기 때문에 이 둘을 비교하는 것은 조심스럽다.

하지만  우리는 대부분의 조직들이 Maven과 Ant 중 어떤 것을 사용할지 의사결정을 해야한다는 사실을 인지하고 있기 때문에 이 도구들에 대해 비교하고 대조할 것이다.

Ant는 빌드 프로세스로서 뛰어나며 target과 dependency를 이용한 모델링된 빌드 시스템이다. 각각의 target은 XML에 집합으로 구성되며 "jar" 작업 뿐만이 아니라 "copy" 작업과  "javac" 작업이 있다. 여러분이 Ant를 사용할 때는, 결과물을 컴파일하고 패키징하는데 특정 명령들을 사용할 수 있다. 

예제 1-1의  build.xml 파일을 살펴보자

예제 1-1. 간단한 Ant build.xml 파일

<project name="my-project" default="dist" basedir=".">

    <description>

        simple example build file

    </description>

  <!-- set global properties for this build -->

  <property name="src" location="src/main/java"/>

  <property name="build" location="target/classes"/>

  <property name="dist"  location="target"/>


  <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>

위의 간단한 Ant 예제를 보면, Ant에게 정확하게 무엇을 하고있는지 말해주는 것을 볼 수 있다. 위의 소스코드 중 파란 부분을 보면 "javac" 작업을 포함하는 compile goal이 있는데, 이것이  "src/main/java" 디렉토리에서 "target/classes" 디렉토리로 소스를 컴파일한다는 것을 볼수 있다. 

Ant에게 소스가 어디에 있는지, 결과 바이트 코드가 어디에 저장되기를 원하는지, 그리고 이 모든 것이 JAR 파일에 어떻게 패키지되어야 하는지를 정확히 말해줘야 한다.

최근 Ant를 덜 절차적이도록 도와주는 개발 도구가 생겼지만, 그래도 Ant를 사용한 개발자의 경험에 보면 XML로 쓰여진 절차 언어를 코딩하는데 있다

위의 Ant 예제와 Maven 예제를 비교해보자. 

Maven에서는 자바 소스에서 JAR 파일을 생성하기 위해 해야 할 일 은 간단하게 pom.xml을 만들고, ${basedir}/src/main/java 에 소스 코드를 위치시키고, 그 다음 command line에서  mvn install 을 실행하면 된다. 

위의 설명했던 간단한 Ant 파일(예제 1-1) 과 동일한 결과를 보여주는 Maven의 pom.xml(예제 1-2)이 아래에 나와있다.


예제 1-2. Maven의 pom.xml

<project>

  <modelVersion>4.0.0</modelVersion>

  <groupId>org.sonatype.mavenbook</groupId>

  <artifactId>my-project</artifactId>

  <version>1.0</version>

</project>


이것이 pom.xml에서 필요한 모든 것이다. 

command line에서 mvn install을 실행하기만 하면 리소스를 처리하고, 소스를 컴파일하고, 단위 테스트를 실행하고, JAR를 만들고, 다른 프로젝트에서 재사용하기 위한 로컬 레파지토리에 JAR 파일을 설치한다. 

수정없이 mvn site를 실행한면  Javadoc에 대한 링크와 소스 코드에 대한 몇몇 보고서를 포함하는 target/site 에 index.html을 발견할 수 있을 것이다.

인정하건데 위의 예제는 소스 코드와 간단한 JAR를 만드는 아주 간단한 예제 프로젝트이다.

Maven 규칙을 따르고 어떠한 의존관계나 변경이 필요하지 않은 프로젝트이다. 만일 변경하기를 원한다면 pom.xml은 크기가 커지게 되며, 수많은 plugin 설정과 의존관계 선언이 포함된 매우 복잡한 여러 메이븐 POM들을 볼 수 있을 것이다. 

하지만 프로젝트의 POM 파일들이 더 상당해 지더라도  Ant를 사용한 유사한 규모의 프로젝트의 빌드 파일과는 전체적으로 완전히 다른 종류의 정보를 가지고 있다. 

Maven POM은 "이것은 JAR 프로젝트이다", "그 소스 코드는 src/main/java 에 있다"와 같은 선언들을 포함한다. 

반면 Ant 빌드 파일은 "이것은 프로젝트이다", "그 소스는 src/main/java 에 있다", "이 디렉토리에 대해 javac를 실행하라", "target/classes 에 결과물들을 위치시켜라", "...에서 JAR를 만들어라" 등과 같은 명확한 명령을 포함한다. 

Ant는 절차에 대해서 명확하게 해야하는 반면에,  Maven에는 소스 코드가 어디에 있는지 그리고 어떻게 처리되어야하는지를 알고있는 "built-in"된 무언가가 존재한다.

이 예제에서 Ant와 Maven의 차이는 다음과 같다.

  • Apache Ant
1. Ant는 공통 프로젝트 디렉토리 구조 또는 기본 행위와 같은 형식적인 규칙을 가지지 않는다. 그래서 Ant한테는 소스코드를 찾는 위치와 결과물을 넣는 위치를 정확하게 알려주어야 한다. 형식적인 규칙들이 시간이 지남에 따라 나타나기는 하였지만, 이러한 규칙들은 프로젝트에서 코딩되지 않았다.

2.Ant는 절차적이다. 그래서 Ant에게 무엇을 할 것인지 언제 할 것인지를 정확하게 알려줘야 한다. 또한 컴파일하고, 그 다음에 복사하고, 그 다음에 압축하라고 알려줘야 한다.

3.Ant는 생명주기를 가지지 않는다. 그래서 목표들과 목표에 대한 의존관계를 정의해야 한다. 또 일일이 각 목표에 대한 일련의 작업을 추가해줘야 한다.
  • Apache Maven

1.Maven은 규칙을 갖는다. 규칙을 따랐기 때문에 소스 코드가 어디에 있는지를 알고, Maven의 컴파일러 플러그인은  target/classes 에 바이트코드를 위치시키고, target에 JAR 파일을 만들었다.

2.Maven은 선언적이다. 간단하게  pom.xml 파일을 만들고 기본 디렉토리에 소스를 위치시켰을 뿐이다. 그리고서 나서 Maven이 나머지를 알아서 수행했다.

3.Maven은 생명주기를 갖는데, mvn install을 실행했을 때 적용된다. 이 명령은  생명주기에 도달할 때까지 일련의 절차를 실행하라고 Maven에게 전달해 준다. 생명주기를 통한 이러한 과정의 부수 효과로써 Maven은 컴파일과 JAR 생성과 같은 일을 수행하는 많은 기본 플러그인 goal을 실행했다.

Ant 라이브러리와 Ivy 같은 기술 지원없이 (이러한 기술을 지원된다고 하더라도) , Ant는 절차적인 빌드라는 것에 대한 느낌을 지울수 없다. Maven의 규칙을 고수하고 있는 Maven POM들은 Ant에 비해 상당히 적은 양의 XML을 가진다. Maven의 또다른 이점은 넓게 공유된 Maven 플러그인에 의존한다는 것이다. 모든 사람은 단위 테스팅을 위해 Maven의 Surefire 플러그인을 사용하며, 누군가가 새로운 단위 테스팅 프레임워크가 지원되도록 추가한다면 단지 프로젝트의 POM에 있는 특정 Maven 플러그인의 버전을 높임으로써 빌드에 새로운 기능을 추가할 수 있다.

표 1-1

Maven

ANT

프로젝트에 대한 기술

각 프로젝트마다 빌드 스크립트 개발

기 구현된 goal(taget) 수행

프로젝트 특화된 target 수행

프로젝트 전체 정보를 정의

빌드 프로세스만 정의

빌드 생명주기, 표준화된 디렉토리 레이아웃

매우 복잡한 빌드 스크립트

재사용 가능한 플러그인, 저장소

스크립트가 재사용 가능하지 않음

매우 빠른 속도로 발전하고 있음

발전속도가 느려짐

그러니까 Maven이냐  Ant냐를 결정하는 것은 이분법적인 것이 아니며, Ant는 여전히 복잡한 빌드에서 사용되고 있다. 만일 현재 빌드가 자주 바뀌는 절차가 있다거나, Maven 표준에 적합하지 않은 특정 방식으로 특정 프로세스를 완료하기 위해 Ant 스크립트를 작성했다면, Maven에서 이러한 스크립트를 여전히 사용할 수 있다. Ant는 핵심 메이븐 플러그인처럼 사용할 수 있고, 수정된 Maven 플러그인들이 Ant에 구현될 수 있으며, Maven 프로젝트는 Maven 프로젝트의 생명주기 내에서 Ant 스크립트를 실행하도록 설정이 가능하다.


Appendix. 최근에는 Maven이후 Gradle이라는 것이 등장했다.

Maven과 Gradle에 대한 이야기는 아래의 링크를 참고해 보면 좋겠다.

http://kwon37xi.egloos.com/4747016

http://kwonnam.pe.kr/wiki/gradle/from_maven


참고 레퍼런스:

http://www.javafaq.nu/java-article1168.html

http://books.sonatype.com/mvnref-book/reference/installation-sect-compare-ant-maven.html


Posted by 비회원