메이븐 목표와 단계는 무엇이며 차이점은 무엇입니까?


답변:


251

목표는 실행되는 순서 목표를 결정하는 데 도움이되는 단계별로 실행됩니다.이를 이해하는 가장 기본적인 이해는 기본적으로 어떤 목표가 어떤 단계에서 실행되는지 보여주는 기본 Maven 수명주기 바인딩 을 보는 것 입니다. 컴파일 단계 목표는 항상 패키지 단계 목표 등 전에 실행되는 테스트 단계 목표 전에 실행됩니다.

maven을 실행할 때 목표 또는 단계를 지정할 수 있다는 사실로 인해 혼란의 일부가 악화됩니다. 단계를 지정하면 maven은 지정된 단계까지 모든 단계를 순서대로 실행합니다 (예를 들어 패키지를 지정하면 먼저 컴파일 단계를 거쳐 테스트 단계를 거쳐 마지막으로 패키지 단계를 실행 함). 각 단계마다 해당 단계에 연결된 모든 목표를 실행하십시오.

Maven 빌드 파일에서 플러그인 실행을 생성하고 목표 만 지정하면 해당 목표가 ​​지정된 기본 단계에 바인딩됩니다. 예를 들어 jaxb : xjc 목표는 기본적으로 generate-resources 단계에 바인딩됩니다. 그러나 실행을 지정할 때 해당 목표의 단계를 명시 적으로 지정할 수도 있습니다.

Maven을 실행할 때 목표를 지정하면 해당 목표와 해당 목표 만 실행됩니다. 즉, jar : jar 목표를 지정하면 jar : jar 목표 만 실행하여 코드를 jar로 패키지합니다. 이전에 컴파일 목표를 실행하지 않았거나 다른 방법으로 컴파일 된 코드를 준비하지 않은 경우 실패 할 수 있습니다.


11
나는 "메이븐이 그것을 말하는 습관했습니다 통과 대신 (최대 주어진 포함) 모든 단계를" "실행" 또는 "실행하는" (이 Maven의에서 불리는 후자의 빌드 라이프 사이클에 소개 ). 실제로 실행되는 목표 코드와 명확하게 구분됩니다. 그러나 그것은 개인적인 취향 일 수 있습니다.
GeroldBroser는 모니카

그러나 우리는 또한 어떤 단계에도 속하지 않는 목표를 실행할 수 있으며 mvn archetype:generate, 그렇다면 maven은 목표 만 실행합니까?
Quazi Irfan 2016 년

1
@ 페이스 마지막 단락에 대한 참조가 있습니까? 나는 그것을 의심하고 여기에서 간단한 프로젝트로 시도했습니다 : mvn testruns : --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test, while mvn compiler:testCompileruns --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser

4
@Pace mvn clean compiler:testCompile--- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile실패합니다 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase( MvnPhase테스트 클래스에서 참조되는 테스트중인 클래스는 어디에 있습니까 ). 목표가 명시 적으로 호출되면 분명히 단계가 호출되지 않습니다.
GeroldBroser는 Monica를

1
geroldbroser와 @ kekko12의 입력을 기반으로 목표를 지정할 때 이전 단계가 아니라 목표 만 실행되도록 마지막 단락을 업데이트했습니다.
페이스

188

수명주기는 일련의 명명 된 단계 입니다.
단계는 순차적으로 실행됩니다. 단계를 실행한다는 것은 모든 이전 단계를 실행한다는 의미입니다.

플러그인은 MOJO ( M aven O ld J ava O bject) 라고 하는 목표 의 모음입니다 . 유추 : 플러그인은 클래스이고 목표는 클래스 내의 메소드입니다.

Maven은 Build Life Cycles 의 중심 개념을 기반으로합니다 . 각 내부 빌드 라이프 사이클 이있다 빌드 페이즈 , 각 내부 빌드 페이즈빌드 목표 .

빌드 단계 또는 빌드 목표를 실행할 수 있습니다. 빌드 단계를 실행할 때 해당 빌드 단계 내의 모든 빌드 목표를 실행합니다. 빌드 목표는 하나 이상의 빌드 단계에 할당됩니다. 빌드 목표를 직접 실행할 수도 있습니다.

세 가지 주요 빌드 수명주기가 있습니다 .

  1. 기본
  2. 깨끗한
  3. 대지

각 빌드 수명주기는 단계로 구성됩니다

예를 들어 default수명주기는 다음과 같은 빌드 단계로 구성됩니다 .

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

위의 단계를 거치려면 명령 하나만 호출하면됩니다.

mvn <phase> { Ex: mvn install }

첫 번째 단계부터 위의 명령의 경우 모든 단계는 '설치'단계까지 순차적으로 실행됩니다. mvn다음과 같이 목표 또는 단계 (또는 여러 목표 또는 여러 단계)를 실행할 수 있습니다.

mvn clean install plugin:goal  

그러나 플러그인을 참조하는 데 사용되는 접두사를 사용자 정의하려는 경우 플러그인 POMmaven-plugin-plugin 에서 구성 매개 변수를 통해 접 두부를 직접 지정할 수 있습니다 .

빌드 단계는 플러그인 목표로 구성

Maven의 기능은 대부분 플러그인에 있습니다. 플러그인은 다음 구문을 사용하여 실행할 수 있는 일련의 목표 를 제공 합니다.

 mvn [plugin-name]:[goal-name]

예를 들어 Java 프로젝트는을 실행하여 compiler-plugin의 compile-goal을 사용하여 컴파일 할 수 있습니다 mvn compiler:compile.

빌드 수명주기는 목표 실행에 순서를 부여하는 데 사용할 수있는 명명 된 단계 목록입니다.

플러그인에서 제공하는 목표는 라이프 사이클의 여러 단계와 연관 될 수 있습니다. 예를 들어, 기본적으로 목표는 compiler:compile 와 관련된 compile 단계 그동안, 목표는 surefire:test 와 연결되어 test . 다음 명령을 고려하십시오.

mvn test

앞의 명령이 실행될 때 Maven은 각 단계와 단계를 포함하여 각 단계와 관련된 모든 목표를 실행합니다 test. 이 경우 Maven은 단계 resources:resources와 관련된 목표를 실행 process-resources한 다음 compiler:compile최종 surefire:test목표를 실행할 때까지 계속 진행합니다 .

그러나 빌드 단계는 빌드 수명주기의 특정 단계를 담당하지만 이러한 책임을 수행하는 방식은 다를 수 있습니다. 그리고 이것은 빌드 단계에 바인딩 된 플러그인 목표를 선언함으로써 이루어집니다.

플러그인 목표는 프로젝트 구축 및 관리에 기여하는 특정 작업 (빌드 단계보다 짧은)을 나타냅니다. 빌드 단계가 0 개 이상일 수 있습니다. 빌드 단계에 구속되지 않은 목표는 빌드 호출주기 외부에서 직접 호출하여 실행할 수 있습니다. 실행 순서는 목표 및 빌드 단계가 호출되는 순서에 따라 다릅니다. 예를 들어 아래 명령을 고려하십시오. cleanpackage(가) 동안 인수, 빌드 단계입니다 dependency:copy-dependencies(플러그인의) 목표입니다.

mvn clean dependency:copy-dependencies package

이것이 실행되는 경우, clean단계는 먼저 실행되고 (깨끗한 라이프 사이클의 모든 이전 단계와 clean단계 자체 가 실행됨을 의미 함 ) dependency:copy-dependencies최종 package단계를 실행하기 전에 목표 (및 이전의 모든 빌드 단계) 기본 수명주기).

또한 목표가 하나 이상의 빌드 단계에 바인딩 된 경우 해당 목표는 모든 단계에서 호출됩니다.

또한 빌드 단계에는 0 개 이상의 목표가 포함될 수 있습니다. 빌드 단계에 바인딩 된 목표가 없으면 해당 빌드 단계가 실행되지 않습니다. 그러나 하나 이상의 목표가있는 경우 모든 목표를 실행합니다.


기본 제공 수명주기 바인딩 일부 단계에는 기본적으로 목표가 있습니다. 기본 수명주기 동안 이러한 바인딩은 패키징 값에 따라 다릅니다.

메이븐 아키텍처 :

여기에 이미지 설명을 입력하십시오

참조 1
참조 2

Maven 라이프 사이클 맵핑을위한 Eclipse 샘플

Maven 라이프 사이클 맵핑을위한 Eclipse 샘플


프로파일이 2 개인 경우 프로파일 1의 모든 플러그인을 먼저 실행 한 다음 프로파일 2의 플러그인을 실행할 수 있습니까?
Bee

[plugin-name]이 예제 mvn [plugin-name]:[goal-name]에서는 플러그인 접두사 입니다. mvn clean install" 멀티 모듈 시나리오에서 사용될 수 없습니다 ". 멀티 모듈은 완전히 다른 주제입니다.
GeroldBroser는 Monica를

동일한 단계에 첨부 된 목표는 어떤 순서로도 준수됩니까?
eel ghEEz

5
이 텍스트의 대부분은 Maven 문서 에서 그대로 복사됩니다 . 이것은 분명히 언급되어야합니다!
Lii

멋진 소스!
Bobo

45

선택한 답변은 훌륭하지만 여전히 주제에 작은 것을 추가하고 싶습니다. 삽화.

다양한 단계가 다른 플러그인에 어떻게 바인딩되었는지, 그리고 그 플러그인이 드러내는 목표를 분명히 보여줍니다.

따라서 다음과 같은 것을 실행하는 경우를 살펴 보겠습니다 mvn compile.

  • 컴파일 목표로 컴파일러 플러그인 을 실행 하는 단계 입니다.
  • 컴파일러 플러그인의 목표가 다릅니다. 들어 mvn compile그것은 특정 목표, 컴파일 목표로 매핑합니다.
  • 달리기와 같다 mvn compiler:compile

따라서 단계는 플러그인 목표로 구성 됩니다.

여기에 이미지 설명을 입력하십시오

참조 링크


20
mvn test가리키는 packagemvn install가리키는 deploy?
Abdull

2
웹에서 발견하여 알아 차림으로써 일러스트레이션 오류처럼 보입니다.
Johnny

3
어디에서 삽화를 얻었습니까? 저작권 및 사용 조건을 확인 했습니까?
Abdull

1
여기에서 가져온 @Abdull 이미지 carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (그리고 많은 다른 웹 페이지에도 나타남). 이 점을 제기 해 주셔서 감사합니다. 중요성을 인식하지 못했습니다.
Johnny

1
다이어그램의 단계에서 플러그인으로의 포인터도 올바르지 않습니다. jar플러그인은 실제로 package단계 에서 실행됩니다 . 그리고 단계와 플러그인 사이의 샌드위치에있는 pom은 약간 혼란 스럽습니다 (pom에서 기본 바인딩 외에도 어떤 단계에서 어떤 플러그인을 실행할지 구성 할 수 있음을 의미한다고 가정합니다). 그러나 일반적인 원칙은 옳습니다.
Alexander Klimetschek

43

정의는 Maven 사이트의 Build Lifecycle 소개 페이지에 자세히 설명되어 있지만 요약 하려고했습니다 .

Maven은 빌드 프로세스의 4 가지 항목을 정의합니다.

  1. 라이프 사이클

    세 가지가 내장 된 라이프 사이클 (일명 빌드 라이프 사이클 ) : default, clean, site. ( 라이프 사이클 참조 )

  2. 단계

    각각의 라이프 사이클로 구성되어 단계 에 대한 예를 들어, default라이프 사이클 : compile, test, package, install, 등

  3. 플러그인

    하나 이상의 목표를 제공하는 이슈.

    패키징 유형 ( jar, war등)을 기반으로 플러그인의 목표는 기본적으로 단계에 구속됩니다. ( 내장 수명주기 바인딩 )

  4. 실행 된 작업 (작업) 플러그인은 하나 이상의 목표를 가질 수 있습니다.

    POM에서 플러그인을 구성 할 때 하나 이상의 목표를 지정해야합니다 . 또한 플러그인에 기본 단계가 정의되어 있지 않은 경우 지정된 목표를 단계에 바인딩 할 수 있습니다.

Maven은 다음과 같이 호출 할 수 있습니다.

  1. 위상 (즉 clean, package)
  2. <plugin-prefix>:<goal>(예를 들어 dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(예를 들어 org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

임의의 또는 전부의 하나 이상의 조합을 갖는 것, 예 :

mvn clean dependency:copy-dependencies package

수명주기 단계 만 (빌드 프로세스의) "단계" 로 간주되는 것이 좋습니다. 차라리 그것을 4 개의 엔티티 / 항목 / things 라고 부릅니다 .
GeroldBroser는 모니카

내가 세상을 볼 때 Build Phase, 나는 그것을 수명주기의 또 다른 단계로 생각하고 혼란스러워합니다.
Quazi Irfan 2016 년

26

나는 좋은 답변이 이미 설치되어 생각하지만, 나는 다른 3 생명주기 (의 쉬운 추적 다이어그램을 추가하고 싶습니다 build, clean그리고 site) 각각의 단계.

여기에 이미지 설명을 입력하십시오

굵게 표시된 단계는 일반적으로 사용되는 주요 단계입니다.


2
generate-resources두 번 나타나고 generate-sources없습니다.
elingerojo

12

Sandeep Jindal과 Premraj에게 감사의 말을 전합니다. 그들의 설명은 이것에 대해 잠시 혼란스러워 이해하는 데 도움이됩니다.

https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/에서 전체 코드 예제와 간단한 설명을 만들었습니다 . 다른 사람들이 이해하는 데 도움이 될 것 같아요.

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

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

1. 수명주기 대 단계

수명주기 는 순차적 으로 단계 의 모음입니다 . 수명주기 참조를 참조하십시오 . phase 를 호출하면 모든 페이즈 도 호출 합니다.

예를 들어, 청소 수명주기 에는 3 단계 ( 사전 청소, 청소, 사후 청소 )가 있습니다.

mvn clean

사전 청소청소를 호출 합니다.

2. 플러그인 대 목표

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

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

mvn clean:clean

이것은 "깨끗한 플러그인에서 깨끗한 목표를 부르십시오"라는 의미입니다 (여기서는 깨끗한 단계와 관련이 없습니다. "clean"이라는 단어를 혼동하지 마십시오. 동일하지 않습니다!)

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

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

mvn clean

clean : clean 목표와 연결되는 pre-clean 단계와 clean 단계를 호출합니다.

거의 다음과 같습니다.

mvn pre-clean clean:clean

자세한 내용과 전체 예는 https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/있습니다.


2

단계와 목표를 가진 Maven 작업 용어.

단계 : 메이븐 단계는 2 개 또는 3 개의 목표와 관련된 일련의 작업입니다.

예 : mvn clean을 실행하면

이것은 단계가 mvn clean 목표를 실행할 것입니다.

목표 : 단계와 연계 된 목표

참조 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html


4
반드시 "2 개 또는 3 개의 목표와 연관"되어 있어야합니다. 그것은 수 없다 아무도 , 하나 또는 세 개 이상의 뿐만 아니라,.
GeroldBroser는 모니카

1

다음과 같은 세 가지 기본 빌드 수명주기가 있습니다.

  • 기본
  • 깨끗한
  • 대지

수명주기 기본값 -> [유효성, 초기화, 소스 생성, 프로세스 소스, 생성 리소스, 프로세스 리소스, 컴파일, 프로세스 클래스, 생성 테스트 소스, 프로세스 테스트 소스, 생성 테스트 리소스, 프로세스 -테스트 리소스, 테스트 컴파일, 프로세스 테스트 클래스, 테스트, 준비 패키지, 패키지, 사전 통합 테스트, 통합 테스트, 통합 후 테스트, 확인, 설치, 배포]

수명주기 청소 -> [사전 청소, 청소, 사후 청소]

수명주기 사이트 -> [사전 사이트, 사이트, 사후 사이트, 사이트 배포]

흐름은 예를 들어 기본 수명주기와 같이 순차적이며 validate 로 시작한 다음 초기화 합니다.

mvn즉, 디버그 모드를 활성화하여 수명주기를 확인할 수 있습니다 .mvn -X <your_goal>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.