728x90


ant를 해본적이 있는가? 필자 블로그에는 ant 관련 포스팅도 있으니 참고하라.

일반적으로 java의 빌드시스템인 ant나 c의 빌드시스템인 make의 경우에는 라이프사이클이 정해진게 없다.

따라서 직접 라이프사이클을 만들어야하며 사람마다 다른 라이프 사이클이 나온다.


그러나 사람마다 다르더라도 전체적으로는 비슷한 루트를 따른다.

maven은 ant에서 사용했던 개개인마다의 자유를 좋다고 생각하지 않는다.

어짜피 자유를 주는것 보다 정해진 틀대로 하는게 협업에 좋다고 생각하기 때문이다.

그래서 maven에서는 라이프사이클이 정해져있다.

maven을 제대로 쓰려면 라이프사이클에 대해서 알아야한다.

라이프 사이클을 한번 보자.

자세한 정보는 공식 사이트인 여기를 참조하라.


Maven의 라이프 사이클


Clean Lifecycle - default lifecycle을 돌려서 만든 결과물을 다시 삭제해 버린다.

Default Lifecycle - 우리가 사용하는 기본 라이프 사이클로 자바 소스파일을 컴파일하고 결과물(jar나 war, 혹은 다른 결과)을 만든다.

Site Lifecycle - 프로젝트의 설명 사이트를 만든다.


여기서 Clean Lifecycle과 Site Lifecycle은 다루지 않겠다.

사실 크게 사용하지 않거나 지금 당장 필요가 없다.

그렇기에 가장 중요한 Default Lifecycle에 대해서 알아보도록 하자.

먼저 용어에 대해서 알아보자.


Maven용어


phase - 각각의 세부 단계를 의미한다.

plugin - maven은 목표를 플러그인을 이용해서 만든다. 플러그인은 연장이라고 생각하면된다. 

goal - 목표로서 각각의 세부단계는 특정 goal을 행하기 위해서 존재한다. 또한 goal은 반드시 플러그인으로 존재한다.



단계(phase)

설명

목표(goal)

validate

프로젝트(pom.xml)의 유효성을 확인한다.

initailize

디렉터리나 properties등의 빌드에 필요한 초기화 작업을 진행한다.

generate-sources

컴파일 과정에 포함될 소스를 생성한다.

process-sources

필터같은 작업을 소스코드에 처리한다.

generate-resources

패키지에 포함될 리소스를 생성한다.

process-resources

필터같은 작업을 리소스 파일에 처리한다.

resources:resources

compile

소스 코드를 컴파일하여서 클래스파일로 만든다.

compile:compile

generate-test-sources

테스트 컴파일 과정에 포함될 소스를 생성한다.

process-test-sources

테스트 컴파일 과정에 필요한 작업을 테스트 소스코드에 처리한다.

resources:testResources

genereate-test-resources

테스트 컴파일 과정에 포함될 리소스를 생성한다.

process-test-resources

테스트 컴파일 과정에 필요한 작업을 리소스 파일에 처리한다.

test-compile

테스트 소스 코드를 컴파일하여 클래스파일로 만든다.

compiler:testCompile

test

테스트를 실행한다.

surefile:test

package

컴파일된 코드를 배포파일(jar,war,ejb)로 패키징한다.

<package>:<package>

install

로컬 저장소에 의존성 패키지를 복사한다.

install:install

deploy

생성된 패키지를 원격 리포지토리에 등록한다.

deploy:deploy


각각의 단계는 반드시 아래로 행한다. 특정 목표만 건너뛰어서 실행하는것은 불가능하다.

가령 compile이라는 목표를 실행한다면 그 아래의 모든 페이즈롤 실행하여야한다.

대신에 각각의 phase는 명령어로 실행할 수 있다.

mvn initailize라고 입력하면 해당 페이즈만 실행하게 된다.


그러나 일반적으로 뚜렷한 결과물을 생성하는 것을 목표, 골이라고 부른다.

골은 플러그인으로 무조건 선언을 해줘야한다. pom.xml에보면 plugin들이 수두룩하게 있는걸 볼 수 있다.

아래같은 코드이다.

<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>

이 부분들은 모두 플러그인이며 골은 플러그인으로만 존재한다.

가령 install 페이즈는 install:install이라고 적혀있는데

여기서 앞의 install은 플러그인을, 뒤는 골을 의미한다.


package페이즈에서 <package>:<package>형태로 되어있다.

이는 여러분의 목표 타입에 따라서 다르다.

여러분의 package 페이즈에 목표가 jar면 goal은 jar:jar이다.

만약 목표가 war이면 goal은 war:war이다.


필자가 색을 칠한 부부분이 있는데 이부분이 자주쓰는 부분이다.

각각의 페이즈를 실행하는 방법은 아래와 같다.


mvn <phage>

or

mvn <plugin>:<goal>


+ Recent posts