우리네 장

[ Maven ] goals와 phases 쉽게 이해해보자! 본문

버전 관리 도구/Maven

[ Maven ] goals와 phases 쉽게 이해해보자!

qpmi1zm29 2022. 11. 28. 18:17

자바 강의를 듣다가 pom.xml에 작성된 plugin이 갑자기 이해가 되지 않아 적어보는 goals와 phases 개념...

정말 좋은 글을 찾아서, 해당 글을 간략히 정리하는 포스팅을 올린다!

출처 : https://tomgregory.com/maven-phases-vs-goals/

 

Maven phases vs. goals

Get a full understanding of the difference between Maven phases and goals, and learn how to execute each of them

tomgregory.com

 


 

Build 란?

 

빌드란 소스 파일을 컴파일하고 validation과 테스트 과정을 거쳐 하나의 jar 및 war 등의 형태의 package 형태의 결과물을 만드는 과정을 의미한다. 

더 나아가 이러한 결과물을 maven 환경에 설치하거나 배포하는 과정도 포함한다.

 

즉, 빌드란 순서를 가진다.  (! 매우 중요)

대략적으로 나열하면 아래와 같다.

  1. COMPILE
  2. TEST
  3. PACKAGE
  4. INSTALL
  5. DEPLOY

이러한 빌드 순서 목록을 Build Life Cycle 이라고 하며,

위와 같은 Life Cycle은 Default Life Cycle 이라고 한다. ( 실제는 더 많은 단계가 있지만 축약한 것이다 )

그 외에도 clean 명령어 실행 시 동작하는 Clean Life Cycle

project documentation을 생성해주는 site Life Cycle이 있다. 

 

Goal 이란?

 

이러한 빌드 과정, 즉 하나의 기능 및 동작을 goal이라고 한다.

compile하는 기능, test하는 기능, package하는 기능 하나하나를 goal이라고 하며,

실제 class의 method로 구현이 되어 있다. 

해당 method들은 return type이 void 이며 메소드 명은 모두 execute이다.

 

이 메소드가 구현되어 있는 class는 MOJO 라고 부른다. ( Maven plain Old Java Object )

( https://github.com/apache/maven-jar-plugin/blob/master/src/main/java/org/apache/maven/plugins/jar/AbstractJarMojo.java 여기서 그 일부 예시를 확인할 수 있다. )

 

Plugin 이란?

 

그리고 이러한 MOJO들을 여러 개 묶어서 jar로 만든 것을 plugin이라고 한다. 

 

임의의 플러그인에 어떤 goal이 속해있는지 알고 싶다면, mvc <plugin name>:help 명령어를 사용한다.

* 그 의미는 모든 플러그인 jar 에 help라는 goal이 있음을 유추할 수 있다. 

 

출처 :&nbsp; https://tomgregory.com/maven-phases-vs-goals/

 

 

 

여기까지 요약 : goals are a chunk of code to do some useful behaviour in Maven, and they get packaged up inside plugins.

 

 

 

메이븐에서 직접 goal을 실행하기 위해서는,

mvc <plugin name>:<goal name> 의 형태로 명령어를 입력한다.

그러나 실제 이런식으로 실행하지 않는다.

 

빌드는 위에서 언급한대로, 순서를 가진다.

그래서 그 전 필요한 과정이 실행되지 않은 채로 중간에 하나의 빌드 과정만 실행이 되면, mvc 명령어 실행에는 성공 할지라도 빈 jar나 war 파일이 나오거나, 에러가 발생하게 된다. 

 

즉, mvn jar:jar 만을 실행하게 되면, 어플리케이션에 소스코드가 있음에도 불구하고 빈 jar 파일이 출력된다.

 

class파일에 대한 내용이 없다. 출처 :&nbsp;https://tomgregory.com/maven-phases-vs-goals/

 

그래서 goal을 이용해서 빌드를 하고자 할때는, 모든 과정을 mvn 명령어에 입력해줘야 한다. 

예를 들면, mvc compiler:compile surefile:test jar:jar

 

이것을 전체 다 나열하지 않고 하나의 구문으로 대체하기 위해 phases를 사용하는 것이다.

왜냐면, phases의 특이 한 phase를 실행하면, 그 전 단계의 phase 들까지 다 실행해주기 때문이다.

 

그러니까 maven을 사용하는 입장에서,

마지막 최종으로 실행할 command만 날려주면 되기 때문에, 더 쉽게 빌드하기 위해서 phase를 사용하는 것이다.

 

 

그럼 Phases란?

 

group of goals.

인데 이 goals 들은 여러 plugin에서 가져올 수 있다. 

 

그림으로 표현하면 아래와 같다. 

 

하나의 phase는 여러 개의 goal 혹은 1개의 goal 혹은 0개의 goal과 매핑 된다.

 

출처 :&nbsp; https://tomgregory.com/maven-phases-vs-goals/

즉,  예시로 mvc package 명령어를 실행하면,

maven은 mvc compile > mvc test > mvc package 순으로 phase를 실행해주며,

내부적으로 mvc compiler:compile > mvc surefile:test > mvc jar:jar를 실행해주게 된다. 

 

 

위에서 언급했던 Life Cycle을 구성하는 것이, 이 Phase 들이다.

이 Phase들이 실행되면서 빌드 과정이 진행되는 것이고, Phase들이 실행된다는 얘기는 Phase에 매핑되는 Plugin 내의 Goal 메소드들이 실행되며 빌드를 진행한다는 얘기가 된다. 

 => 이게 결론이다!

 

 

 

추가적으로 goal이 없는 phase에 대해서 그 용도가 무엇인지 궁금할 수 있다. 

그 예시로 Verify 가 있는데, 이 phase는 3rd party의 플러그인을 사용해서 goal을 추가하는 경우,

외부 goal의 대한 그 결과물의 유효성을 확인해준다. 

 

출처 :&nbsp; https://tomgregory.com/maven-phases-vs-goals/

 

위 이미지 예시는 integration-test라는 goal을 failsafe 플러그인을 추가함으로써 실행하고,

그 결과를 확인하는 설정이 되겠다. ( check result of integration-test )

 

 

끗-. 재미따