메이븐 빌드 라이프사이클 (Maven Build Lifecycle)
메이븐 라이프사이클은 빌드와 배포 중에 일어나는 작업들을 정의한 것이다. 빌트인으로 제공하는 것으로는 default
, clean
, site
가 있다. 메이븐 빌드는 타겟 프로젝트의 배포를 위해 특정한 라이프사이클을 따른다. 빌드인 라이프사이클로는 아래의 항목이 있다.
default
: 메인 라이프사이클로 배포에 대한 책임이 있다.clean
: 이전 빌드에서 생성된 모든 파일을 지워서 프로젝트를 깔끔하게 만들어준다.site
: 프로젝트의 사이트 문서를 만들어준다.
각각의 라이프사이클
은 연속된 여러 개의 페이즈
로 이루어져있다. 예를들어 default
빌드 라이프사이클
은 23개의 페이즈
를 포함한다. clean
은 3개, site
는 4개를 포함한다.
메이븐 페이즈 (Maven Phase)
메이븐 페이즈
는 메이븐 빌드 라이프사이클에서의 각 단계를 나타낸다. 각 페이즈
는 특정한 태스크에 대한 책임을 진다.
default
빌드 라이프사이클에서 가장 중요한 페이즈는 아래와 같다.
validate
: 빌드를 위해 필요한 모든 정보가 이용 가능한지 확인한다.compile
: 소스코드를 컴파일한다.test-compile
: 테스트 소스코드를 컴파일한다.test
: 유닛 테스트를 수행한다.package
: 컴파일된 소스코드를 배포 가능한 포맷으로 패키징한다. (jar
,war
등)integration-test
: 통합 테스트를 실행할 필요가 있을 때, 패키지를 진행하고 배포한다.install
: 로컬 리포지토리에 패키지를 설치한다.deploy
: 원격 리포지토리에 패키지를 복사한다. 다른 개발자와 해당 프로젝트를 공유하고 싶을 때 사용한다.
mvn <PHASE>
위 명령어를 실행하면, 단 하나의 페이즈
만 실행하는 것이 아니고 필요한 모든 선행 페이즈
도 함께 실행된다.
mvn deploy
이를테면, deploy
페이즈를 실행하는 경우에 deploy
이전에 필요한 모든 페이즈가 다 실행되는 것이다. 그래서 사실상 위에 언급한 default
라이프사이클을 모두 실행하는 것과 별반 다를 것이 없다.
메이븐 골 (Goal)
각 페이즈
는 연속된 골
로 이루어져 있다. 각 골
은 하나의 세부적인 작업을 책임진다.
페이즈
를 실행할 때, 이 페이즈
에 종속된 모든 골
은 순서대로 수행된다. 아래는 몇개의 페이즈
와 종속되는 골
의 예제이다.
compiler:compile
:compiler
플러그인에서 나온compile
골은compile
페이즈에 종속되어 있다.compiler:testCompile
: 이는test-compile
페이즈에 종속되어 있다.surefire:test
: 이는test
페이즈에 종속되어 있다.install:install
: 이는install
페이즈에 종속되어 있다.jar:jar
,war:war
: 이는package
페이즈에 종속되어 있다.
메이븐 플러그인 (Plugin)
메이븐 플러그인이란, 골
을 모아놓은 것을 말한다. 하지만 플러그인 내부에 있는 골
은 모두 같은 페이즈에 종속될 필요가 없다.
이를테면, 아래는 Failsafe 플러그인의 예시이다. 통합 테스트를 책임진다.
<build>
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.failsafe.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Filesafe 플러그인이 2개의 메인 골
로 이루어진 것을 확인할 수 있다.
integration-test
: 통합 테스트를 실행한다.verify
: 모든 통합 테스트가 통과했는지 확인한다.
아래의 명령어를 이용하여 특정 플러그인에 속한 모든 골
을 확인할 수 있다.
# mvn <PLUGIN>:help
mvn failsafe:help
출력 값은 아래와 같이 나올 것이다.
This plugin has 3 goals:
failsafe:help
Display help information on maven-failsafe-plugin.
Call mvn failsafe:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
failsafe:integration-test
Run integration tests using Surefire.
failsafe:verify
Verify integration tests ran using Surefire.
전체 페이즈를 실행하지 않고 특정 골을 실행하고 싶다면, 아래와 같은 명령어를 이용할 수 있다.
# mvn <PLUGIN>:<GOAL>
mvn failsafe:integration-test
특정 페이즈 (Phase) 에 종속된 모든 골 (Goal) 살펴보기
아래 명령어를 통해 확인할 수 있다.
mvn help:describe -Dcmd=PHASENAME
위 명령어를 사용하기 위해서는 아래의 의존성을 설치해주어야 한다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
</plugin>
사실 따로 설치 안해도 메이븐 명령어가 수행되면 자동으로 설치된다.
Intellij 도구를 이용해 손쉽게 mvn 명령어 사용하기
Lifecycle
이나 Plugins
내부에 위치한 Phase
를 우클릭하여 Modify Run Configuration...
을 클릭한 뒤에 ...
위와 같이 Run
항목에 있는 명령어를 수정하면 된다.
위의 Run Configuration
에 있는 명령들은 직접 커스텀한 mvn 명령들이다. 저런식으로 저장해놓고 편리하게 mvn 명령어를 사용할 수 있다.
결과 확인하기
help:describe -Dcmd=clean -f pom.xml
clean
페이즈가 어떻게 이루어지는지 확인해보는 명령어이다.
[INFO] 'clean' is a phase within the 'clean' lifecycle, which has the following phases:
* pre-clean: Not defined
* clean: org.apache.maven.plugins:maven-clean-plugin:2.5:clean
* post-clean: Not defined
명령 수행 결과로 clean
페이즈가 clean
라이프사이클 안에 있으며 아래의 페이즈를 포함하고 있음을 확인할 수 있다. 위의 정보는 단순히 플러그인 골이라는 것을 알려준다.
[INFO] 'org.apache.maven.plugins:maven-compiler-plugin:3.1:compile' is a plugin goal (aka mojo).
Mojo: 'compiler:compile'
compiler:compile
Description: Compiles application sources
Implementation: org.apache.maven.plugin.compiler.CompilerMojo
Language: java
Bound to phase: compile
Available parameters:
annotationProcessors
Names of annotation processors to run. Only applies to JDK 1.6+ If not
set, the default annotation processors discovery process applies.
compilerArgs
Sets the arguments to be passed to the compiler if fork is set to true.
Example:
<compilerArgs>
<arg>-Xmaxerrs=1000</arg>
<arg>-Xlint</arg>
</compilerArgs>
레퍼런스
'빌드 도구 > 메이븐' 카테고리의 다른 글
메이븐의 .lastupdated 확장자 파일이란? (0) | 2023.03.03 |
---|---|
메이븐 인코딩 에러 해결하기 (0) | 2022.06.08 |
로컬 파일 메이븐 의존성 추가하기 (0) | 2022.06.08 |
intellij mvnw 파일이 없을 때 메이븐 경로 잡기 (0) | 2022.06.08 |
메이븐이란? (What is Maven) (0) | 2022.06.01 |