MAVEN 에 대해 알아보자.
서론
vert.x 기반의 프로젝트를 경험하면서 maven을 처음 접하게 되었다. 4~5년전 안드로이드 프로젝트를 하면서 gradle을 사용했지만 역시 시간이 지나고 나니 gradle 또한 낯설게 느껴진다. 이렇게 정리를 함으로써 다시 maven을 접했을 때 좀더 익숙해질 수 있기를 바란다.
특징
- 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌으며 이후 gradle이 개발되어 사용되는 추세이다.
- pom.xml 문서에 의해 환경이 정의되며 사용할 라이브러리를 정의하면 해당 라이브러리가 작동하는데 필요한 추가적인 라이브러리들까지 자동으로 네트워크를 통해 다운로드 된다.
- 아파치재단에서 운영하는 중앙 저장소에서 라이브러리를 관리하며 자기 회사만의 별도의 저장소도 구축할 수 있다.
Plugin
Maven 에서 제공하는 모든 기능은 플러그인을 기반으로 동작한다. Maven 자체는 기본적인 기능만 가지고 있고 대부분의 기능들은 플러그인을 통해 제공하도록 되어 있다. 플러그인들은 몇가지 goal을 가지고 있고 goal은 플러그인에 포함되어 있는 명령이다. 즉, 플러그인은 하나 이상의 goal의 집합체이다.
Maven에서 활용할 수 있는 대부분의 플러그인은 다음 두 개의 사이트에서 확인할 수 있다.
Goal
Maven이 수행할 수 있는 여러가지 동작을 수행하는 명령을 Goal이라고 한다. Maven의 명령 형식은 아래와 같다.
mvn [-option] [<plugin>:<goal(s)>] [<phase(s)>]
예를 들어
mvn clean compiler:compile
clean phase를 실행하고, compiler plugin의 compile goal을 실행한다. Phase에 goal이 연결되어 있기 때문에 phase 를 통해 Maven 빌드를 실행하면 해당 phase 에 연결되어 있는 goal이 실행된다.
Phase
Phase 는 빌드 라이프사이클에서 빌드 단계와 각 단계의 순서만을 정의하고 있는 개념으로 빌드 과정에서 phase가 빌드 작업을 하지는 않는다. 실질적인 빌드 작업은 각 phase에 연결되어 있는 플러그인의 goal에서 수행한다. Phase 를 통해 goal을 실행하면 처음부터 해당 단계까지 모두 순차적으로 빌드가 된다. mvn test 라는 phase을 통해 빌드를 실행하면
- process-resources(resources:resources)
- compile(compiler:compile)
- process-test-resources(resources:testResources)
- test-compile(compiler:testCompile)
- test(surefile:test)
순서로 phase가 실행되는 것을 로그를 통해 확인할 수 있다.
LifeCycle
메이븐은 프레임워크이기 때문에 동작 방식이 정해져있고, 미리 정의된 빌드 순서가 존재한다. 이를 라이프사이클이라고 한다. 라이프사이클을 구성하는 각각의 단계를 Phase라고 하며 각 Phase는 의존관계를 가지고 있어 해당 Phase가 수행되려면 이전 Phase가 모두 수행되어야 한다. 그러나 Test의 경우 생략이 가능하다. 아래에 기본적인 phase들을 나열해보았다. 원래 더 많은 phase들이 존재한다.
- Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.
- Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계, target 디렉토리 삭제
- Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
- Compile : 프로젝트의 소스코드를 컴파일, 리소스 파일을 target/classes 디렉토리로 복사
- Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
- Package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 배포를 위한 패키지로 만드는 단계
- Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
- Install : 패키지를 로컬 저장소에 설치하는 단계
- Site : 프로젝트 문서와 사이트 작성, 생성하는 단계, package 수행 후, local repo에 install 수행
- Deploy : 만들어진 package를 원격 저장소에 release 하는 단계, 웹서버 배포가 아니라 회사 repo에 배포하는 것이다.
Deploy의 경우 아래와 같이 distributionManagement 항목이 기술되어야 한다.
...
<distributionManagement>
<repository>
<id>releases-repo</id>
<name>Releases Repository</name>
<url>회사repository주소</url>
</repository>
<snapshotRepository>
<id>snapshots-repo</id>
<name>Snapshots Repository</name>
<url>회사repository주소</url>
</snapshotRepository>
</distributionManagement>
Maven은 프로젝트 생성에 필요한 phase 들을 Build 라이프사이클이라 정의하고 default, clean, site 세가지를 표준으로 정의하고 있다. 라이프사이클은 Build Phase 들로 구성되며 일련의 순서를 갖는다. Phase는 실행단위로서 goal과 바인딩된다.
아래 이미지는 Build default 라이프사이클의 주요 phase이다.
기본라이프 사이클 | 세부 페이즈 | 설명 |
---|---|---|
clean | 빌드 시 생성되었던 산출물을 삭제 | |
1. pre-clean | clean 작업 전에 사전작업 | |
2. clean | 이전 빌드에서 생성된 모든 파일 삭제 | |
3. post-clean | 사후 작업 | |
default | 프로젝트 배포절차, 패키지 타입별로 다르게 정의됨 | |
1. validate | 프로젝트 상태 점검, 빌드에 필요한 정보 존재유무 체크 | |
2. initialize | 빌드 상태를 초기화, 속성 설정, 작업 디렉터리 생성 | |
3. generate-sources | 컴파일에 필요한 소스 생성 | |
4. process-sources | 소스코드를 처리 | |
5. generate-resources | 패키지에 포함될 자원 생성 | |
6. compile | 프로젝트의 소스코드를 컴파일 | |
7. process-classes | 컴파일 후 후처리 | |
8. generate-test-source | 테스트를 위한 소스 코드를 생성 | |
9. process-test-source | 테스트 소스코드를 처리 | |
10. generate-test-resources | 테스팅을 위한 자원 생성 | |
11. process-test-resources | 테스트 대상 디렉터리에 자원을 복사하고 가공 | |
12. test-compile | 테스트 코드를 컴파일 | |
13. process-test-classes | 컴파일 후 후처리 | |
14. test | 단위 테스트 프레임워크를 이용해 테스트 수행 | |
15. prepare-package | 패키지 생성 전 사전작업 | |
16. package | 개발자가 선택한 war, jar 등의 패키징 수행 | |
17. pre-integration-test | 통합테스팅 전 사전작업 | |
18. integration-test | 통합테스트 | |
19. post-integration | 통합테스팅 후 사후작업 | |
20. verify | 패키지가 품질 기준에 적합한지 검사 | |
21. install | 패키지를 로컬 저장소에 설치 | |
22. deploy | 패키지를 원격 저장소에 배포 | |
site | 프로젝트 문서화 절차 | |
1. pre-site | 사전작업 | |
2. site | 사이트문서 생성 | |
3. post-site | 사후작업 및 배포 전 사전작업 | |
4. site-deploy | 생성된 문서를 웹 서버에 배포 |
Reference
Maven의 phase, goal , lifeCycle