Maven 시작하기

Maven 시작하기

Maven 은 Ant 의 대안으로 만들어진 자바용 프로젝트 관리 도구이다.

본 글에서는 메이븐의 핵심 용어인 Lifecycle, Phase, 그리고 Goal 에 대해 알아본다.

Maven 의 Lifecycles

Maven 은 3개의 lifecycle 로 이루어져 있다.

default

프로젝트를 배포하기 위한 라이프 사이클

clean

프로젝트를 클린하는 라이프 사이클

site

프로젝트의 사이트 문서를 만들기 위한 라이프 사이클

Maven 의 Phases

각각의 라이프 사이클은 여러개의 Phase 로 이루어져있다.

예를 들어, default 라이프 사이클은 다음과 같은 phase 들로 이루어져 있다.

  • validate - 프로젝트가 올바른 상태인지, 그리고 필요한 정보들은 모두 있는지 검증한다
  • compile - 소스코드를 컴파일한다
  • test - 알맞은 유닛 테스트 프레임워크로 테스트한다. 이러한 테스트는 코드가 패키징되거나 배포되었을 것을 요구헤선 안된다
  • package - 컴파일된 파일을 JAR와 같이 배포 가능한 형태로 패키징한다.
  • verify - 통합 테스트를 수행한다
  • install - 로컬에서 다른 프로젝트의 의존성으로 사용될 수 있도록 이 패키지를 로컬 저장소에 인스톨한다
  • deploy - 패키지를 원격 저장소에 복사한다

물론 위의 phase 말고도 다른 phase 들이 있다.

만약 다음과 같은 명령어로 특정 phase 를 실행하고자 하면,

mvn verify

default 라이프 사이클에 있는 phase 들을 validate 부터 verify 까지 순차적으로 실행한다.

프로젝트 내에 서브 프로젝트들이 있다면 메이븐은 모든 서브 프로젝트들에 대해 같은 동작을 수행한다.

보통 이름에 하이픈(-)이 붙은 Phase(pre-*, post-*, or process-*)들은 커맨드 라인에서 직접 호출되지 않는다.

이 Phase 들은 외부에는 불필요한 중간 결과물을 만들기 때문이다.

예를 들어, integration-test phase 에는 Jacoco 같은 코드 커버리지 툴이나 Tomcat, Docker 같은

컨테이너 플러그인들이 pre-integration-test Phase 에 Goal 을 바인딩 하여 컨테이너 설정 등 환경 세팅을 하도록 하며,

post-integration-test Phase 에도 Goal 을 바인딩하여 커버리지 통계를 수집하거나 컨테이너를 해제하도록 한다.

고로, 커맨드 라인에서 integration-test Phase 만 직접 호출하면 커버리지 레포트도 나오지 않으며, 톰캣 웹서버나 도커 인스턴스는 실행 중인 채로 남게 된다.

Maven 의 Goals

Goal 은 Phase 보다도 한 단계 하위 개념이며, 보통 jacoco:reportspring-boot:run 과 같이 plugin:goal 의 형태로 적는다.

각각의 Goal 은 0개 이상의 Phase 에 포함되며, 각각의 Build Phase 는 0개 이상의 Goals 로 이루어진다.

Phase 가 실행된다는 것은 Phase 에 속한 Goal 들이 실행된다는 의미다.

메이븐 2.0.5 이상 버전에서 Phase 내 Goal 들은 POM 에 선언된 순서대로 실행된다.

어떠한 Phase 에도 속하지 않은 Goal 은 Phase 가 실행될 때 자동으로 실행되는 것이 아니라

다음의 dependency:copy-dependencies goal 과 같이 외부적에서 직접 명시하여 실행하는데 사용된다.

mvn clean dependency:copy-dependencies package

위와 같은 명령어를 실행하면 적어준 순서대로 clean phase 를 먼저 실행하고(물론 clean lifecycle 에서 clean phase 까지의 모든 phase 들을 순차적으로 실행한다는 뜻)

dependency:copy-dependencies goal 을 실행하고, 마지막으로 package phase 를 실행한다(마찬가지로 default lifecycle 에서 package phase 까지 순차적으로 실행)

만약 특정 Phase 에 속한 Goal 이 하나도 없다면, 해당 Phase 는 실행되지 않는다.

Plugins 을 통해 새로운 Goals 을 Phases 에 추가할 수도 있다. 예를 들어, Compiler 플러그인은 메인 코드를 컴파일하는compile Goal 과 테스트 코드를 컴파일하는 testCompile Goal 을 가지고 있다.

다음은 POM 의 안에있는 특정 플러그인에 goals 을 설정해준 예다.

...
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>display-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>time</goal>
</goals>
</execution>
</executions>
</plugin>
...

참고: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

Comments