메이븐 목표와 단계의 차이 / 관계는 무엇입니까? 그들은 서로 어떻게 관련되어 있습니까?
메이븐 목표와 단계의 차이 / 관계는 무엇입니까? 그들은 서로 어떻게 관련되어 있습니까?
답변:
목표는 실행되는 순서 목표를 결정하는 데 도움이되는 단계별로 실행됩니다.이를 이해하는 가장 기본적인 이해는 기본적으로 어떤 목표가 어떤 단계에서 실행되는지 보여주는 기본 Maven 수명주기 바인딩 을 보는 것 입니다. 컴파일 단계 목표는 항상 패키지 단계 목표 등 전에 실행되는 테스트 단계 목표 전에 실행됩니다.
maven을 실행할 때 목표 또는 단계를 지정할 수 있다는 사실로 인해 혼란의 일부가 악화됩니다. 단계를 지정하면 maven은 지정된 단계까지 모든 단계를 순서대로 실행합니다 (예를 들어 패키지를 지정하면 먼저 컴파일 단계를 거쳐 테스트 단계를 거쳐 마지막으로 패키지 단계를 실행 함). 각 단계마다 해당 단계에 연결된 모든 목표를 실행하십시오.
Maven 빌드 파일에서 플러그인 실행을 생성하고 목표 만 지정하면 해당 목표가 지정된 기본 단계에 바인딩됩니다. 예를 들어 jaxb : xjc 목표는 기본적으로 generate-resources 단계에 바인딩됩니다. 그러나 실행을 지정할 때 해당 목표의 단계를 명시 적으로 지정할 수도 있습니다.
Maven을 실행할 때 목표를 지정하면 해당 목표와 해당 목표 만 실행됩니다. 즉, jar : jar 목표를 지정하면 jar : jar 목표 만 실행하여 코드를 jar로 패키지합니다. 이전에 컴파일 목표를 실행하지 않았거나 다른 방법으로 컴파일 된 코드를 준비하지 않은 경우 실패 할 수 있습니다.
mvn archetype:generate
, 그렇다면 maven은 목표 만 실행합니까?
mvn test
runs : --- 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:testCompile
runs --- maven-compiler-plugin:3.1:testCompile ...
.
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
테스트 클래스에서 참조되는 테스트중인 클래스는 어디에 있습니까 ). 목표가 명시 적으로 호출되면 분명히 단계가 호출되지 않습니다.
수명주기는 일련의 명명 된 단계 입니다.
단계는 순차적으로 실행됩니다. 단계를 실행한다는 것은 모든 이전 단계를 실행한다는 의미입니다.플러그인은 MOJO ( M aven O ld J ava O bject) 라고 하는 목표 의 모음입니다 . 유추 : 플러그인은 클래스이고 목표는 클래스 내의 메소드입니다.
Maven은 Build Life Cycles 의 중심 개념을 기반으로합니다 . 각 내부 빌드 라이프 사이클 이있다 빌드 페이즈 , 각 내부 빌드 페이즈 가 빌드 목표 .
빌드 단계 또는 빌드 목표를 실행할 수 있습니다. 빌드 단계를 실행할 때 해당 빌드 단계 내의 모든 빌드 목표를 실행합니다. 빌드 목표는 하나 이상의 빌드 단계에 할당됩니다. 빌드 목표를 직접 실행할 수도 있습니다.
세 가지 주요 빌드 수명주기가 있습니다 .
예를 들어 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 개 이상일 수 있습니다. 빌드 단계에 구속되지 않은 목표는 빌드 호출주기 외부에서 직접 호출하여 실행할 수 있습니다. 실행 순서는 목표 및 빌드 단계가 호출되는 순서에 따라 다릅니다. 예를 들어 아래 명령을 고려하십시오. clean
및 package
(가) 동안 인수, 빌드 단계입니다 dependency:copy-dependencies
(플러그인의) 목표입니다.
mvn clean dependency:copy-dependencies package
이것이 실행되는 경우, clean
단계는 먼저 실행되고 (깨끗한 라이프 사이클의 모든 이전 단계와 clean
단계 자체 가 실행됨을 의미 함 ) dependency:copy-dependencies
최종 package
단계를 실행하기 전에 목표 (및 이전의 모든 빌드 단계) 기본 수명주기).
또한 목표가 하나 이상의 빌드 단계에 바인딩 된 경우 해당 목표는 모든 단계에서 호출됩니다.
또한 빌드 단계에는 0 개 이상의 목표가 포함될 수 있습니다. 빌드 단계에 바인딩 된 목표가 없으면 해당 빌드 단계가 실행되지 않습니다. 그러나 하나 이상의 목표가있는 경우 모든 목표를 실행합니다.
기본 제공 수명주기 바인딩 일부 단계에는 기본적으로 목표가 있습니다. 기본 수명주기 동안 이러한 바인딩은 패키징 값에 따라 다릅니다.
메이븐 아키텍처 :
Maven 라이프 사이클 맵핑을위한 Eclipse 샘플
[plugin-name]
이 예제 mvn [plugin-name]:[goal-name]
에서는 플러그인 접두사 입니다. mvn clean install
" 멀티 모듈 시나리오에서 사용될 수 없습니다 ". 멀티 모듈은 완전히 다른 주제입니다.
선택한 답변은 훌륭하지만 여전히 주제에 작은 것을 추가하고 싶습니다. 삽화.
다양한 단계가 다른 플러그인에 어떻게 바인딩되었는지, 그리고 그 플러그인이 드러내는 목표를 분명히 보여줍니다.
따라서 다음과 같은 것을 실행하는 경우를 살펴 보겠습니다 mvn compile
.
mvn compile
그것은 특정 목표, 컴파일 목표로 매핑합니다.mvn compiler:compile
따라서 단계는 플러그인 목표로 구성 됩니다.
참조 링크
mvn test
가리키는 package
및 mvn install
가리키는 deploy
?
jar
플러그인은 실제로 package
단계 에서 실행됩니다 . 그리고 단계와 플러그인 사이의 샌드위치에있는 pom은 약간 혼란 스럽습니다 (pom에서 기본 바인딩 외에도 어떤 단계에서 어떤 플러그인을 실행할지 구성 할 수 있음을 의미한다고 가정합니다). 그러나 일반적인 원칙은 옳습니다.
정의는 Maven 사이트의 Build Lifecycle 소개 페이지에 자세히 설명되어 있지만 요약 하려고했습니다 .
Maven은 빌드 프로세스의 4 가지 항목을 정의합니다.
라이프 사이클
세 가지가 내장 된 라이프 사이클 (일명 빌드 라이프 사이클 ) : default
, clean
, site
. ( 라이프 사이클 참조 )
단계
각각의 라이프 사이클로 구성되어 단계 에 대한 예를 들어, default
라이프 사이클 : compile
, test
, package
, install
, 등
플러그인
하나 이상의 목표를 제공하는 이슈.
패키징 유형 ( jar
, war
등)을 기반으로 플러그인의 목표는 기본적으로 단계에 구속됩니다. ( 내장 수명주기 바인딩 )
골
실행 된 작업 (작업) 플러그인은 하나 이상의 목표를 가질 수 있습니다.
POM에서 플러그인을 구성 할 때 하나 이상의 목표를 지정해야합니다 . 또한 플러그인에 기본 단계가 정의되어 있지 않은 경우 지정된 목표를 단계에 바인딩 할 수 있습니다.
Maven은 다음과 같이 호출 할 수 있습니다.
clean
, package
)<plugin-prefix>:<goal>
(예를 들어 dependency:copy-dependencies
)<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
Build Phase
, 나는 그것을 수명주기의 또 다른 단계로 생각하고 혼란스러워합니다.
나는 좋은 답변이 이미 설치되어 생각하지만, 나는 다른 3 생명주기 (의 쉬운 추적 다이어그램을 추가하고 싶습니다 build
, clean
그리고 site
) 각각의 단계.
굵게 표시된 단계는 일반적으로 사용되는 주요 단계입니다.
generate-resources
두 번 나타나고 generate-sources
없습니다.
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/ 에 있습니다.
단계와 목표를 가진 Maven 작업 용어.
단계 : 메이븐 단계는 2 개 또는 3 개의 목표와 관련된 일련의 작업입니다.
예 : mvn clean을 실행하면
이것은 단계가 mvn clean 목표를 실행할 것입니다.
목표 : 단계와 연계 된 목표
참조 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
다음과 같은 세 가지 기본 빌드 수명주기가 있습니다.
수명주기 기본값 -> [유효성, 초기화, 소스 생성, 프로세스 소스, 생성 리소스, 프로세스 리소스, 컴파일, 프로세스 클래스, 생성 테스트 소스, 프로세스 테스트 소스, 생성 테스트 리소스, 프로세스 -테스트 리소스, 테스트 컴파일, 프로세스 테스트 클래스, 테스트, 준비 패키지, 패키지, 사전 통합 테스트, 통합 테스트, 통합 후 테스트, 확인, 설치, 배포]
수명주기 청소 -> [사전 청소, 청소, 사후 청소]
수명주기 사이트 -> [사전 사이트, 사이트, 사후 사이트, 사이트 배포]
흐름은 예를 들어 기본 수명주기와 같이 순차적이며 validate 로 시작한 다음 초기화 합니다.
mvn
즉, 디버그 모드를 활성화하여 수명주기를 확인할 수 있습니다 .mvn -X <your_goal>