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:report
나 spring-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 의
... |
참고: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html