Maven : 수명주기 대 단계 대 플러그인 대 목표 [닫기]


106

상대적으로 새로운 개발자이지만 잠시 동안 사용해 왔지만 Maven 기본 사항을 강화하고 싶습니다. 내 문제의 일부는 Ant에 대한 경험 이 없다는 것인데, 이는 많은 설명이 유래 한 것 같습니다. 나는 튜토리얼을 읽고 보며 같은 용어를 계속 듣습니다.

  • 라이프 사이클
  • 단계
  • 플러그인

제가 배운 바에 따르면 라이프 사이클은 가장 광범위하고 단계, 플러그인 및 / 또는 목표로 구성 (또는 완료)되는 것 같습니다.

질문 : 이러한 용어가 어떻게 관련되어 있으며 가장 일반적인 예에 ​​대한 정보를 제공 할 수 있습니까?

더 명확하고 기본적 일수록 좋습니다!



감사합니다 @Drejc-내 검색에서 이것을 찾지 못했다는 것을 믿을 수 없습니다. 이제 읽어 보겠습니다.
Jeff Levine

2
따라서 명확히하기 위해 lifecycle = lifecycle을 빌드합니다. 그중 기본, 정리 및 사이트의 세 가지 유형이 있습니다. 다른 설명에서는 build 라는 네 번째 수명주기가 있다고 생각했습니다 .
Jeff Levine


3
너무 넓은? 이것은 Maven의 핵심 기본 사항과 관련이 있으며 몇 가지 훌륭하고 자세한 답변이 있습니다. 단일 maven 태그가없는 중재자 는 이것을 결정할 수 없습니다.
Gerold Broser

답변:


73

메이븐 라이프 사이클 (추상) 개념입니다 커버 모든 스텝 (또는 더 나은 : 메이븐 지원하기로 결정 디자이너 모든 단계) 프로젝트의 개발 수명에서 발생할 것으로 예상된다. 이러한 단계 (또는 단계)는 Maven 용어에서 단계 라고 합니다.

메이븐 플러그인 의 / 공급 업체의 컨테이너입니다 목표. 목표에 구현 된 코드는 진정한 도구입니다. ( 핵심 자체의 Maven은 플러그인을 관리하고 목표를 실행하는 것 입니다.) 각 플러그인의 목표는 모든 수명주기 단계에 할당 / 바인딩 될 수 있습니다.

mvn <phase> Maven을 호출 할 때 모든 단계 (매번)를 통과 하고 주어진 단계 이전 및 이전 단계 (및 포함) 에 바인딩 된 모든 목표 (플러그인에서 제공 ) 를 실행합니다 . 목표가 바인딩되지 않은 단계가 있으면 아무 작업도 수행되지 않습니다. 그러나 그럼에도 불구하고 단계는 통과됩니다.

즉 , Maven의 기본 제공 수명주기 중 하나에 "추가 단계를 삽입" 할 수 없습니다 . 그들은 이미 거기에 항상 있습니다! 자체 단계로 자체 라이프 사이클을 개발할 수 있지만 이는 단순히 Maven을 그대로 사용하는 것 이상입니다.

목표는 직접 실행될 수도 있습니다. 이는 mvn단계 나 목표없이 실행될 때 알려줍니다 [여기에서 줄 바꿈 및 가독성을 위해 단축 됨].

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

참조 :

Maven이 POM에서 목표 바인딩없이 수행 할 작업을 어떻게 알고 있는지 궁금한 경우 default-bindings.xml끝에에있는 링크 가 있습니다 <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

기본 제공 수명주기 ( clean , default , site )의 단계는 <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml아래에 선언되어 .../<component>/<role>org.apache.maven.lifecycle.Lifecycle있습니다.


41

Maven : 수명주기 대 단계 대 플러그인 대 목표

이 스레드에서 누락 된 또 다른 수준의 세분성을 명확히하기 위해 늦게 답변 합니다. Maven 빌드의 가장 작은 단위 인 실행 (목표)입니다.

따라서 특정 플러그인이 제공 하는 일련의 구성된 목표를 호출 할 수있는 단계 (낮은 세분성,주기 단계) 로 구성된 빌드주기 (기본적으로 특정 전체 목표에 대한 일련의 작업 )가 있습니다 . 즉, Maven은 (또한) 플러그인 실행자이며 각 플러그인은 하나 이상의 목표를 제공 할 수 있습니다. 그런 다음 (또한) 기본 라이프 사이클에서 대부분의 경우 어느 단계에 어떤 목표를 연결할지 결정합니다 (즉, 기본값 없음). 그러나 실제로는 또 다른 수준을 가질 수 있습니다. 실행 (동일한 목표, 동일한 플러그인에서 또는 다른 플러그인에서 다른 목표)

전체를 다시 시작하기 위해 준비한 사진 여기에 이미지 설명 입력

실제로 Maven이 빌드 로그의 고유 한 문자열을 통해이를 표시하는 방법 (가장 작은 작업 단위)입니다.

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

예를 들어 다음과 같습니다.

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

실제로 의미합니다 (다양한 수준의 세분화를 통해).

  • 동안 compile단계 (언급되지 불행히도)>
  • Maven 컴파일러 플러그인 ( artifactIdversion)을 호출합니다. >
  • 나는 그 compile목표 를 불러 일으키고있다 >
  • default-compile실행에 의해 정의 된대로

실제로 다른 단계 또는 동일한 단계에 바인딩 된 동일한 목표 (동일한 플러그인의)를 가질 수 있지만 다른 실행 (즉, 다른 구성)에있을 수 있기 때문에 고유합니다. maven-compiler-plugin, 예를 들어, 또한 동안 사용되는 test-compile단계 (ITS를 통해 컴파일 테스트 코드 (다른 상) testCompile다른 실행에 목표) ( default-testCompile). 또한 POM에서 지정한 실행 (및 잠재적으로 다른 구성)에 의해 정의 된대로 다른 단계에서 일부 자동 생성 코드를 컴파일 (동일한 플러그인 및 목표 사용) 할 수 있습니다.

기본 실행은 Maven 패키징 바인딩을 통해 즉시 제공됩니다 . 즉, 기본적으로 (및 구성에 대한 규칙 적용) Maven은 이미 특정 단계에서 특정 목표 (표준 플러그인의)를 호출합니다. 이러한 기본 호출의 실행 ID는 특정 규칙 에 따라 정의됩니다 .

이는 Maven 빌드의 기본 동작 (바인딩)을 실제로 재정의하려는 경우 동일한 플러그인에 대해 POM에서 정확히 동일한 실행 ID를 지정 (재정의)해야하는 이유도 설명합니다. 예를 들어, maven-compiler-plugin동일한 default-compileID를 사용하지만 존재하지 않는 단계 (또는 비어있는 단계)에 바인딩 된 의 실행을 정의하기 만하면 컴파일을 건너 뛸 수 있습니다.

간단히 말해서 : 실행은 Maven에게 어떤 목표를 어떤 단계에서 어떤 구성으로 실행할 것인지 알려줍니다.

일부 실행은 기본적으로 제공됩니다 (defaul 바인딩), 이는 단 6 줄 의 maven 최소 pom 이 이미 많은 작업 (컴파일, 테스트, 패키지 등)을 수행 할 수있는 이유를 설명합니다 . 특정 단계에서 표준 플러그인의 목표를 실행합니다. 구성. 그런 다음을 통해 구성을 추가 할 수 있습니다 물건 빌드에 (실행)을 이미 구성 플러그인의 동작에 영향 없다 (이 경우에는 섹션을하지만, 단지 충분하다).pom.xmlexecutionsconfiguration

예, 빌드주기 (및 해당 단계)를 건너 뛰고 목표 (플러그인)를 직접 호출 할 수 있습니다. 다음을 상상해보십시오.

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(참고 : 한 번의 호출에서만 인라인으로 호출 할 수도 있습니다.)

여기서 우리는 앱 코드, 테스트 코드, 테스트 실행 및 패키지를 컴파일합니다. 이것이 얼마나 수동적이고 오류가 발생하기 쉽고 반복적이고 시간이 많이 걸리는지 상상해보십시오. 구성에 대한 규칙은 우리에게 도움이됩니다. Maven은 빌드 수명주기와 단계를 도입 합니다. 기본 수명주기 (이름 없음, 즉 기본값)는 모범 사례 및 규칙 (Maven의 진언)에 따라 다양한 단계를 제공합니다.
위와 동일한 결과를 얻으려면 다음을 실행 mvn package하면됩니다. 그러면 프로젝트가 자동으로 컴파일, 테스트 및 패키징됩니다. 어떻게? 플러그인 호출. 즉, 단계는 의미 있고 구성 가능한 플러그인 (목표) 실행 집합입니다. 더 표준 적으로 만들기 위해 Maven은 각 단계에 대해 먼저 선행 단계를 호출하므로 예를 들어 테스트하려는 경우 먼저 컴파일해야합니다.

추신은 동일한에 대해 여러 목표를 지정할 때 execution두 개의 다른 목표 (따라서 여전히 고유 한 튜플)에 대해 빌드 로그에서 두 개의 다른 실행 (동일한 ID 사용)을 명확하게 볼 수 있습니다.


18

Sandeep Jindal 및 Premraj에 대한 크레딧 (여기에서 Maven 목표 및 단계는 무엇이며 차이점은 무엇입니까? ). 그들의 설명은 내가 이해하는 데 도움이됩니다.

https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/에서 전체 코드 예제와 간단한 설명을 만들었습니다 . 다른 사람들이 이해하는 데 도움이 될 수 있고 직접 무언가를 시도 할 수 있다고 생각합니다.

간단히 말해서, 세 가지를 한 번에 모두 이해하려고해서는 안됩니다. 먼저 다음 그룹의 관계를 이해해야합니다.

  • 라이프 사이클 대 단계
  • 플러그인 대 목표

1. 라이프 사이클 대 단계

라이프 사이클 은 일련의 단계 모음입니다 . 여기 라이프 사이클 참조를 참조하십시오 . 단계 를 호출하면 이전의 모든 단계 도 호출 됩니다.

예를 들어, 클린 라이프 사이클 에는 3 단계 ( 사전 청소, 청소, 사후 청소 )가 있습니다.

mvn clean

그것은 호출 사전 청결 하고 깨끗한 .

2. 플러그인 대 목표

목표플러그인 의 액션과 같습니다 . 따라서 플러그인이 클래스 인 경우 목표는 메소드입니다.

다음과 같이 목표를 호출 할 수 있습니다.

mvn clean:clean

이것은 "깨끗한 플러그인에서 깨끗한 목표를 불러라"를 의미합니다 (여기에서는 깨끗한 단계와 관련이 없습니다. "깨끗한"이라는 단어가 당신을 혼동하지 않도록하십시오! 위의 링크에서 전체 설명을 참조하십시오)

3. 이제 단계와 목표 사이의 관계 :

단계목표 (들)에 (사전) 연결될 수 있습니다 . 예를 들어, 일반적으로 정리 단계는 정리 목표에 연결됩니다. 따라서이 명령을 호출하면 :

mvn clean

청소 전 단계와 청소 : 청소 목표에 연결되는 청소 단계를 호출합니다.

다음과 거의 동일합니다.

mvn pre-clean clean:clean

1
@ 2. & 3. IMHO clean:clean는 최선의 선택이 아닙니다. clean특히 초보자에게 혼란 스러울 수있는 4 개의 항목 (라이프 사이클, 단계, 플러그인, 목표)이 있습니다 (처음에는 저를위한 것이 었습니다). @ 3. "링크"라는 동사는 IMHO도 좋은 선택이 아닙니다. 공식 Maven 용어는 " bind "입니다.
Gerold Broser 2017-06-23

@GeroldBroser. clean : clean에 완전히 동의합니다. 나는 링크의 전체 설명에서 그것을 설명하고 경고했습니다. 이 경고도 여기에 복사하겠습니다. 이 혼란스러운 단어에 대해 사람들에게 알리는 것이 좋기 때문에 내가 사용한 이유는 특히 공식 maven 문서에서 그것을 사용하고 있기 때문에 명확하게 설명합니다. 그리고 네, 저도 혼란 스러웠습니다. 어쨌든, 감사 의견에 대한 많은
Surasin Tancharoen

오타 : 공식 받는다는 문서를 사용하고 명확하게 설명하지 않습니다
Surasin Tancharoen

17

그리고 뒤늦게 또 다른 다이어그램

  • 노란색 직사각형으로 수명주기
  • 더 진한 파란색의 "호출 가능" 단계가있는 파란색 직사각형의 라이프 사이클 단계 (예 : 하이픈이있는 단계는 프로젝트를 잘 정의 된 상태로 두도록 설계되지 않았을 수 있으므로 일반적으로 명령 줄에서 호출되지 않음)
  • 파란색 마름모꼴로 목표 . 표시된 연결 / 바인딩 "단계-> 목표"는 "jar" 패키징 모드 중 하나입니다 . 모든 단계에는 목표가 연결될 수 있습니다. 바인딩은 "기본"라이프 사이클에 대해서만 표시되지만 이는 물론 각 라이프 사이클에 적용됩니다.
  • 플러그인 은 회색으로 잘린 직사각형입니다. 플러그인은 단계에 바인딩 될 수있는 목표를 제공합니다.

Maven 수명주기, 단계, 목표, 플러그인


graphml 파일 (무료 yEd 편집기로 편집)은 github.com/dtonhofer/diagrams
David Tonhofer

1) " 진한 파란색 "으로 표시된 ""호출 가능 "단계 "가 정확히 무엇을 의미 합니까? 모든 메이븐 단계 (I 오히려 그것을 호출하지만 "호출"입니다 호출 가능한 어떤 코드가 없기 때문에, 라고 직접적으로는 위상을 호출하여). 아니면 목표가 바인딩 된 (기본적으로) " callable " 단계를 호출 합니까? , 및 을 보면 사실이 아닙니다 . validateinitializeverify
Gerold Broser

2) resources:[testR|r]esources목표는 수명주기process-sources또는 process-test-sources단계에jar 묶여 있지 않습니다 .
Gerold Broser

3) modello:javaModello 플러그인 분명히 특정 영역입니다. 플러그인의 목표를 단계에 바인딩하면 모든 단계가 유지됩니다.
Gerold Broser

@GeroldBroser 댓글에 따라 수정되었습니다. "호출 가능"은 명령 줄에서 호출 할 수 있고 프로젝트가 유효한 상태로 유지 될 것으로 기대할 수 있음을 의미합니다. 사이에 의미있는 차이가 없다 호출호출호출은 이란 무엇입니까 Maven을 소개 합니다.
David Tonhofer

12

소스 이것은 정말 좋은 튜토리얼입니다

수명주기, 수명주기 단계, 플러그인 및 플러그인 목표는 Maven의 핵심입니다.

  • Maven 명령 mvn 은 수명주기 단계 또는 플러그인 목표 만 인수로 허용 할 수 있습니다.
  • Maven에는 기본, 정리 및 사이트의 세 가지 수명주기가 있습니다.
  • 각 수명주기는 수명주기 단계로 구성 되어 있으며 총 28 개 단계가 있습니다. 기본값은 21 개 ( validate, ..., compile, ..., package, ..., install, deploy ), clean 3 ( pre-clean, clean, post-clean ) 및 사이트 4 ( pre-site, site, post-site, site-deploy ).
  • mvn 명령을 사용하여 수명주기 단계를 호출하면 모든 이전 단계가 순차적으로 실행됩니다.
  • 수명주기 단계 자체는 일부 작업을 수행 할 수있는 기능이 없으며 작업을 수행하기 위해 플러그인에 의존합니다.
  • 프로젝트 및 패키징 유형에 따라 Maven은 다양한 플러그인 목표를 라이프 사이클 단계 및 위임 된 작업을 수행하는 목표에 바인딩 합니다.

Java 프로젝트에서 " mvn package "를 실행하면 Maven은 다음 그림과 같이 플러그인 목표를 수명주기 단계에 바인딩합니다.

mvn-plugins-package-goal


1
당신이 언급 한 자료는 꽤 좋습니다. 감사합니다!
William Kinaan

@ " Maven 명령 mvn 은 수명주기 단계 또는 플러그인 목표 만 인수로 허용 할 수 있습니다. "이 올바르지 않습니다. 옵션 도 허용 합니다.
Gerold Broser 2017-06-23

" Java 프로젝트에서"mvn 패키지 "를 실행할 때 Maven은 플러그인 목표를 수명주기 단계에 바인딩 합니다."는 사실이 아닙니다. 목표 바인딩은 실행되기 오래 전에 발생합니다 mvn .... default-bindings.xml 또는 POM에서 Maven이 아니라 사람이 수행합니다.
Gerold Broser

7

여기에 설명 된대로 조금 더 설명하기 위해

Maven 빌드는 다음과 같은 수명 주기로 분할됩니다.

  • 깨끗한
  • 빌드 (기본값)
  • 대지

이러한 각주기는 여러 단계로 나뉩니다. 예를 들어 빌드는 다음과 같은 단계로 나뉩니다.

  • 자원을 준비하다
  • 엮다
  • 꾸러미
  • 설치

단계 이전에 실행 목표를 가지고 이후 포스트 예를 들면, 단계를 :

  • 사전 청소-청소 단계 전에 실행됩니다.
  • 사후 청소-청소 단계 후에 실행됩니다.

원하는 경우 추가 "삽입 된"단계로 목표를 볼 수 있습니다. 자세한 내용은 여기를 읽 거나 @Gerolds 답변 을 살펴보십시오 .


1
이 답변은 전체적으로 정확하지 않습니다. 내 대답을 참조하십시오 .
Gerold Broser 2015-06-20

이 질문에 답한 지 3 년이 지났는데도 .. 당신이 이겼습니다 ... 이제 넘어 가세요.
Drejc

이기는 것이 아닙니다. 나중에 우연히 발견하면 오래된 질문, 답변 및 의견을 수정하지 않습니까?
Gerold Broser 2018

3

페이즈 대 라이프 사이클 : Life Cycle 의 모음입니다 phases. 단계를 호출하면 이전에 오는 모든 단계도 호출됩니다. Maven에는 다음과 같은 3 가지 기본 제공 빌드 수명주기가 있습니다.

  1. 클린 라이프 사이클-여기에는 프로젝트 정리 (새 빌드 및 배포 용)가 포함됩니다.
  2. 기본 / 빌드 수명주기-프로젝트의 전체 배포를 처리합니다.
  3. 사이트 라이프 사이클-프로젝트의 Java 문서 생성을 처리합니다. 여기에 이미지 설명 입력

클린 라이프 사이클에는 사전 청소, 청소 및 사후 청소의 3 단계가 있습니다. 기본 및 사이트 수명주기의 단계는 그림에 표시된 것과 동일합니다.


마지막 단락은 오해의 소지가 있습니다. 특히 첫 번째와 마지막 문장. 목표단계 는 완전히 다릅니다. 일부는 동일한 이름을 가지고 있기 때문에 혼동해서는 안됩니다. Re " 목표는 위 그림에서 볼 수있는 단계입니다. ": 그림에 언급 된 단일 목표가 없습니다. 이것들은 모두 단계 입니다. Re " 특정 목표를 수행해야 할 때 단계 이름을 'goal'로 작성합니다. ": 플러그인의 목표를 명시 적으로 실행할 수 있지만 일반적인 방법은를 사용하여 특정 단계 까지 빌드를 수행하는 것 입니다 mvn <phase>. 여기 내 대답을 참조하십시오.
Gerold Broser

감사합니다. "Plugin vs Goal"부분을 제거했습니다. 곧 업데이트하겠습니다.
Arun Raaj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.