[ 유용한 프로그램 ]

메이븐(Maven) 시작하기 (2/3) [펌]

SojuMan 2010. 7. 8. 16:05

지난 번 포스트에서 메이븐으로 자바 프로젝트의 라이브러리를 관리하는 법을 살펴보았다. 이번 포스트에서 살짝 더 나아가서 메이븐의 꽃이라고 할 수 있는 플러그인에 대해서 알아보자.

메이븐 플러그인은 메이븐의 핵심이다.

일단 개념부터 짚고 넘어가자. 알아야하는 개념은 플러그인(Plugin)과 골(Goal)이다.

플러그인은 메이븐의 핵심 구성 요소이다. 다시 말하면 메이븐은 플러그인들의 집합이라고 할 수 있다. 참고로 메이븐 홈페이지의 플러그인 페이지에서 사용 가능한 플러그인들의 목록을 볼 수 있다. 그리고 플러그인은 관련있는 골들의 집합이다. 골은 메이븐에서 작업의 단위이라고 할 수 있다. 앤트(Ant)를 안다면 앤트의 태스크(task)와 유사한 것으로 생각해도 될 것이다. 메이븐 생명주기의 관점에서 보면 빌드 단계(Build Phase)에는 그 단계가 실행하는 골이 정해져있다. 예를 들면, compile 빌드 단계는 compiler 플러그인의 compile 골을 실행하고, package 빌드 단계는 jar 플러그인의 jar 골을 실행한다.

정리하면 메이븐에는 무수한 플러그인들이 있고, 각 플러그인들은 관련된 골들을 묶어 놓은 것이다. 그리고 각 골들은 메이븐 빌드 단계에서 수행되는 하나의 작업인 것이다. 더 자세한 설명은 역시 메이븐 홈페이지메이븐 책(Maven: The Definitive Guide)를 참고하자.

메이븐 플러그인을 사용해 보자.

사실 지난 번 포스트에서 이미 메이븐 플러그인을 사용해 보았다.

mvn archetype:generate -DgroupId=net.kjunine -DartifactId=sample -Dpackage=net.kjunine.sample -Dversion=1.0-SNAPSHOP

위 명령어를 기억하는가? 위 명령어에서 'archetype:generate'는 archetype 플러그인의 generate 골을 실행하라는 메이븐 명령어이다. 참고로 archetype 플러그인은 자바 프로젝트를 생성하는 것과 관련있는 골들의 모음이다. 이 플러그인에 대해 자세한 설명은 여기를 참고하자. 여기서 보여주고 싶은 것은 플러그인의 골을 실행하는 방법이다. mvn 명령어에 플러그인:골 형식의 옵션과 -D를 붙인 key=value 형식의 파라메터들을 덧붙여서 실행하면 된다.

그리고 지난 번 포스트에서 완성된 프로젝트를 실행하는 방법이 좀 까다로웠던 것을 기억하는가?

java -cp target/sample-1.0-SNAPSHOT.jar;"%HOME%/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar" net.kjunine.sample.Sample hello kjunine

위와 같이 클래스패스를 복잡하게 설정하면서 실행했었는데 이것을 exec 플러그인을 사용하면 간단하게 실행시킬 수 있다. exec 플러그인의 상세한 설명은 여기를 참조하자.

mvn exec:java -Dexec.mainClass=net.kjunine.sample.Sample -Dexec.args="hello kjunine"

exec 플러그인이 POM 파일을 참조해 라이브러리와 프로젝트의 의존 관계를 파악해서 알아서 클래스패스를 설정해주므로 명령어가 매우 간단해졌다. 결과는 다음과 같이 나온다.

[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'exec'.
[INFO] ------------------------------------------------------------------------
[INFO] Building sample
[INFO]    task-segment: [exec:java]
[INFO] ------------------------------------------------------------------------
[INFO] Preparing exec:java
[INFO] No goals needed for project - skipping
[INFO] [exec:java]
olleh
eninujk[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Fri Oct 09 21:51:55 KST 2009
[INFO] Final Memory: 5M/9M
[INFO] ------------------------------------------------------------------------

플러그인을 실행하는 방법을 알아봤으니 이번에는 POM 파일에서 플러그인의 설정을 하는 방법을 알아보자.

메이븐으로 자바 프로젝트를 빌드할 때 compiler 플러그인의 설정을 바꿔주지 않으면 기본적으로 JDK 1.4 버전을 기준으로 컴파일한다. 그래서 지난 번 포스트에서는 JUnit 라이브러리의 버전이 3.8.2였던 것이다. 이번 기회에 JDK 버전과 JUnit 버전을 각각 1.5와 4.5로 올리고, @Test 어노테이션(Annotation)을 사용해 보자.

1. POM 파일(pom.xml)을 수정하자.

03.  <modelVersion>4.0.0</modelVersion>
04.  <groupId>net.kjunine</groupId>
05.  <artifactId>sample</artifactId>
06.  <packaging>jar</packaging>
07.  <version>2.0-SNAPSHOT</version>
08.  <name>sample</name>
09.  <url>http://maven.apache.org<;/url>
10.  <dependencies>
11.    <dependency>
12.      <groupId>commons-lang</groupId>
13.      <artifactId>commons-lang</artifactId>
14.      <version>2.4</version>
15.    </dependency>
16.    <dependency>
17.      <groupId>junit</groupId>
18.      <artifactId>junit</artifactId>
19.      <version>4.5</version>
20.      <scope>test</scope>
21.    </dependency>
22.  </dependencies>
23.  <build>
24.    <plugins>
25.      <plugin>
26.        <groupId>org.apache.maven.plugins</groupId>
27.        <artifactId>maven-compiler-plugin</artifactId>
28.        <configuration>
29.          <source>1.5</source>
30.          <target>1.5</target>
31.        </configuration>
32.      </plugin>
33.    </plugins>
34.  </build>
35.</project>

주목할 부분은 세 부분이다. 첫째, 프로젝트의 version 을 '2.0-SNAPSHOT'으로 올렸다. 둘째, junit 라이브러리의 버전을 4.5로 올렸다. 셋째, <build /> 부분에 그 안에 compiler 플러그인의 설정을 추가하였다. 여기서 플러그인을 설정하는 방법을 잘 봐두자. 다른 플러그인도 마찬가지 방법으로 설정할 수 있다. compiler 플러그인에 대한 상세한 설명은 여기를 참조하자.

2. SampleTest 클래스를 수정하자.

01.package net.kjunine.sample;
02.  
03.import static org.junit.Assert.*;
04.  
05.import org.junit.Test;
06.  
07.public class SampleTest {
08.  
09.    @Test
10.    public void testReverse() {
11.        String actual = Sample.reverse("hello");
12.        String expected = "olleh";
13.        assertEquals(expected, actual);
14.    }
15.  
16.}

JUnit 4.5의 @Test 어노테이션을 사용하도록 수정하였다.

mvn test 명령어를 실행하면 빌드와 테스트가 성공하는 것을 볼 수 있다. 그리고 mvn install 명령어를 실행하면 설치가 성공하는 것을 볼 수 있고, 로컬 리포지토리에 이전 버전인 1.0-SNAPSHOT 버전과 최신 버전인 2.0-SNAPSHOT 버전이 모두 설치되어 있는 것을 볼 수 있다.

메이븐 플러그인을 맛보다..

이 포스트에서 메이븐 플러그인을 살펴보았다. 그러나 여기서 살펴본 것은 거의 맛만 본 수준이다. 메이븐에는 무수한 플러그인이 있고, 또 직접 플러그인을 만들 수도 있다. 메이븐을 제대로 알려면 최대한 많은 프러그인들을 사용해보고 또, 직접 플러그인을 만들어 보는 것이 좋을 것이다.

포스트를 쓰다보니 길어져서 또 나누게 되었다. 다음 포스트에서는 메이븐과 이클립스의 연동을 주제로 '메이븐 시작하기' 시리즈를 마무리하고자 한다. 그럼 다음 포스트에서..