원본 : http://kjunine.tistory.com/entry/getting-started-with-maven-2
지난 번 포스트에서 메이븐으로 자바 프로젝트의 라이브러리를 관리하는 법을 살펴보았다. 이번 포스트에서 살짝 더 나아가서 메이븐의 꽃이라고 할 수 있는 플러그인에 대해서 알아보자.
메이븐 플러그인은 메이븐의 핵심이다.
일단 개념부터 짚고 넘어가자. 알아야하는 개념은 플러그인(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)을 수정하자.
01.
<
project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
02.
xsi:schemaLocation
=
"http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"
>
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 버전이 모두 설치되어 있는 것을 볼 수 있다.
메이븐 플러그인을 맛보다..
이 포스트에서 메이븐 플러그인을 살펴보았다. 그러나 여기서 살펴본 것은 거의 맛만 본 수준이다. 메이븐에는 무수한 플러그인이 있고, 또 직접 플러그인을 만들 수도 있다. 메이븐을 제대로 알려면 최대한 많은 프러그인들을 사용해보고 또, 직접 플러그인을 만들어 보는 것이 좋을 것이다.
포스트를 쓰다보니 길어져서 또 나누게 되었다. 다음 포스트에서는 메이븐과 이클립스의 연동을 주제로 '메이븐 시작하기' 시리즈를 마무리하고자 한다. 그럼 다음 포스트에서..