MAVEN 에 대해 알아보자.

3 분 소요

서론

vert.x 기반의 프로젝트를 경험하면서 maven을 처음 접하게 되었다. 4~5년전 안드로이드 프로젝트를 하면서 gradle을 사용했지만 역시 시간이 지나고 나니 gradle 또한 낯설게 느껴진다. 이렇게 정리를 함으로써 다시 maven을 접했을 때 좀더 익숙해질 수 있기를 바란다.

특징

  1. 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌으며 이후 gradle이 개발되어 사용되는 추세이다.
  2. pom.xml 문서에 의해 환경이 정의되며 사용할 라이브러리를 정의하면 해당 라이브러리가 작동하는데 필요한 추가적인 라이브러리들까지 자동으로 네트워크를 통해 다운로드 된다.
  3. 아파치재단에서 운영하는 중앙 저장소에서 라이브러리를 관리하며 자기 회사만의 별도의 저장소도 구축할 수 있다.

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을 통해 빌드를 실행하면

  1. process-resources(resources:resources)
  2. compile(compiler:compile)
  3. process-test-resources(resources:testResources)
  4. test-compile(compiler:testCompile)
  5. test(surefile:test)

순서로 phase가 실행되는 것을 로그를 통해 확인할 수 있다.

Maven 기본 Phase와 Goal간의 관계

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

maven (메이븐 구조, 차이점, 플러그인, 라이프사이클, 의존성, pom.xml)

Maven 명령어(Goal)이란?

업데이트: