요새는 gradle 쓰지, ant 를 얼마나 쓸까 싶으냐만은 언제나 후다다닥 할땐-_-)s


.. 자

Ant 빌드에서 메이븐 명령어를 사용하는 방법이다.

전체적인 스텝은 다음과 같다. 

  1. maven-ant-task 다운로드
  2. build.xml 에 namespace 추가
  3. 메이븐 홈 위치 설정
  4. target 작성 후 target 안에 artifact:xxxxx 와 같은 task 추가
  5. target  실행

이제 각 단계 별로 자세히 알아보자.

1.Maven Ant Task 다운로드

ant 에서 maven 을 사용하기 위해서는 maven 이 제공해주는 ant 용 메이븐 task 가 필요한다.

다음 사이트에서 maven-ant-task-x.x.x.jar 파일을 다운로드받는다. (본 문서 작성시에 안정버젼은 2.1.3 이였다.)

Download Site : http://maven.apache.org/ant-tasks/

다운받은 maven-ant-task-x.x.x.jar 파일을 build.xml 이 참조할 수 있는 위치에 둔다. (ex: src/antlib/maven-ant-task-2.1.3.jar)

2.build.xml 에 namespace 추가

build.xml 의 루트 element 인 project 엘리먼트에 다음과 같이 artifact namespace 를 추가한다.

이때 maven-ant-task.classpath 패스에 1단계에서 내려받은 maven-ant-task-x.x.x.jar 를 참조할 수 있도록 위치를 지정한다.

build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="ECM RPC Project" default="genkey" basedir="." xmlns:artifact="antlib:org.apache.maven.artifact.ant">
    <path id="maven-ant-tasks.classpath" path="src/antlib/maven-ant-tasks-2.1.3.jar" />   
    <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
             uri="antlib:org.apache.maven.artifact.ant"
             classpathref="maven-ant-tasks.classpath" />
</project>

 

3.자신의 환경에 맞도록 메이븐 홈 위치 설정

사용할 메이븐 홈 디렉토리를 설정한다. 본 문서에서는 시스템 환경변수로부터 읽어들였다.

build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="ECM RPC Project" default="genkey" basedir="." xmlns:artifact="antlib:org.apache.maven.artifact.ant">
    <path id="maven-ant-tasks.classpath" path="src/antlib/maven-ant-tasks-2.1.3.jar" />   
    <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
             uri="antlib:org.apache.maven.artifact.ant"
             classpathref="maven-ant-tasks.classpath" />
     
    <property name="maven-home.path" value="${env.M2_HOME}" />
     
</project>

 

4.target 작성

메이븐 명령어(mvn)도 결국은 ant target 으로 실행된다. target 을 생성한 후 하위에 필요한 maven task 를 작성하도록 하자.

메이븐 task 들은 2단계에서 설정한 namespace 로 찾을 수 있다.

자세한 모든 task 는 공식 사이트(http://maven.apache.org/ant-tasks/) 를 참조하라.

다음은 "mvn clean war:exploded -Pcomas -Pslothink1" 과 동일한 명령어를 수행하는 task 이다.

build.xml
<target name="make-webapp-with-slothink1-profile">
    <artifact:mvn pom="pom.xml" mavenHome="${maven-home.path}" fork="true">
        <arg value="clean"/>
        <arg value="war:exploded"/>
        <arg value="-Pcomas"/>
        <arg value="-Pslothink1"/>
    </artifact:mvn>
</target>

 

5.target 실행

4단계에서 설정한 target 을 실행한다. 

 

참조 : http://maven.apache.org/ant-tasks

이런 경우가 있습니다. 이클립스에서 컴파일을 하면 문제가 되는 패키지 없이 컴파일이 잘되는데, 유독 maven 에서 클린을 해서 날려버린다음 빌드를 하려하면 특정 패키지를 못 찾는 경우가 있습니다.
도대체 감을 못잡으시겠죠?

원인은 간단합니다. 오타와 이클립스 빌드 구조의 한계죠.
예를 들어 pom.xml 에서 depdency 하는 것이 다음과 같다면 발생합니다.

<dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <version>1.0.2</version>
            <scope>provide</scope>
</dependency>

provide 가 아니라 provided 죠?

<dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <version>1.0.2</version>
            <scope>provided</scope>
 </dependency>


가 맞습니다. 그럼 이클립스에서는 왜 잘 되나구요?
이클립스는 provide 나 compile 이나, test 나 똑같이 빌드패스에 등록을 하여 사용합니다. 즉, 구분을 하지 않습니다. 따라서 이클립스 프로젝트의 빌드에서는 scope 를 처리 안한다는거죠. 그래서 빌드가 됩니다

반면! 메이븐이 컴파일 할 경우에는 scope 를 따지니깐, 오타가 있으면 무시해버리죠. 즉, 저 패키지를 가져오지 않아 빌드가 실패가 됩니다.

이넘 때문에 오랜 시간 고생하고 있었네요. 매번 이클립스 빌드 후 인스톨...ㅡㅡ;;

+ Recent posts