Maven目标和阶段之间有什么区别/关系?它们如何相互关联?
Maven目标和阶段之间有什么区别/关系?它们如何相互关联?
Answers:
目标是分阶段执行的,有助于确定目标的执行顺序。对此的最佳理解是查看默认的Maven生命周期绑定,该绑定显示默认情况下哪些目标在哪个阶段运行。编译阶段目标将始终在测试阶段目标之前执行,而测试阶段目标将始终在软件包阶段目标之前执行,依此类推。
当您执行Maven时可以指定目标或阶段,这一事实加剧了部分混乱。如果您指定一个阶段,则maven将按顺序运行所有阶段,直到您指定的阶段(例如,如果您指定程序包,它将首先运行编译阶段,然后是测试阶段,最后是程序包阶段),并且对于每个阶段,运行该阶段附加的所有目标。
当您在Maven构建文件中创建插件执行并且仅指定目标时,它将把该目标绑定到给定的默认阶段。例如,默认情况下,jaxb:xjc目标绑定到generate-resources阶段。但是,当您指定执行时,您也可以显式指定该目标的阶段。
如果在执行Maven时指定目标,则它将运行该目标,并且仅运行该目标。换句话说,如果指定jar:jar目标,它将仅运行jar:jar目标以将您的代码打包到jar中。如果您以前没有运行过编译目标或以其他方式准备了已编译的代码,则很可能会失败。
mvn archetype:generate
,在这种情况下,maven仅执行目标?
mvn test
运行: --- 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
,而mvn compiler:testCompile
只是运行--- 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(中号艾文Ø LD Ĵ AVA Ø bject)。
类比:插件是一类,目标是该类中的方法。
Maven基于构建生命周期的核心概念。在每个构建生命周期内都有构建阶段,在每个构建阶段内都有构建目标。
我们可以执行构建阶段或构建目标。在执行构建阶段时,我们将执行该构建阶段中的所有构建目标。将构建目标分配给一个或多个构建阶段。我们还可以直接执行构建目标。
有三个主要的内置构建生命周期:
例如,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
但是,如果你想定制用于引用您的插件前缀,你可以直接通过对配置参数指定前缀maven-plugin-plugin
在你的插件的POM。
构建阶段由插件目标组成
Maven的大多数功能都在插件中。插件提供了可以使用以下语法执行的一组目标:
mvn [plugin-name]:[goal-name]
例如,可以通过运行编译器插件的compile-goal来编译Java项目mvn compiler:compile
。
构建生命周期是命名阶段的列表,可用于为目标执行指定顺序。
插件提供的目标可以与生命周期的不同阶段关联。例如,默认情况下,目标 compiler:compile
与compile
阶段关联,而目标 surefire:test
与test
阶段关联。考虑以下命令:
mvn test
当执行前面的命令时,Maven将运行与每个阶段相关的所有目标,直到该阶段为止test
。在这种情况下,Maven先运行resources:resources
与process-resources
阶段关联的目标,然后再运行compiler:compile
,依此类推,直到最终运行surefire:test
目标。
但是,即使构建阶段负责构建生命周期中的特定步骤,执行这些职责的方式也可能有所不同。这是通过声明与这些构建阶段绑定的插件目标来完成的。
插件目标表示一个特定的任务(比构建阶段还完善),该任务有助于项目的构建和管理。它可能绑定到零个或多个构建阶段。可以通过直接调用在构建生命周期之外执行不受任何构建阶段约束的目标。执行的顺序取决于调用目标和构建阶段的顺序。例如,考虑以下命令。在clean
和package
参数是构建阶段,而dependency:copy-dependencies
为(的插件)的目标。
mvn clean dependency:copy-dependencies package
如果要执行此步骤,clean
则将首先执行该阶段(这意味着它将运行干净生命周期的所有先前阶段,再加上clean
阶段本身),然后执行dependency:copy-dependencies
目标,然后最终执行该package
阶段(及其所有先前的构建阶段)默认生命周期)。
而且,如果目标绑定到一个或多个构建阶段,则在所有这些阶段都将调用该目标。
此外,构建阶段还可以绑定零个或多个目标。如果构建阶段没有目标绑定,则该构建阶段将不会执行。但是,如果绑定了一个或多个目标,它将执行所有这些目标。
内置生命周期绑定
默认情况下,某些阶段将目标绑定到它们。对于默认生命周期,这些绑定取决于包装的价值。
Maven架构:
用于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站点的“页面构建生命周期简介”中详细介绍了这些定义,但是我尝试总结一下:
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
,我将其视为生命周期的另一个阶段,这使我感到困惑。
generate-resources
出现两次并且generate-sources
丢失。
归功于Sandeep Jindal和Premraj。经过一段时间的困惑,他们的解释帮助我理解了。
我在这里https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/创建了一些完整的代码示例和一些简单的说明。我认为这可能有助于其他人理解。
简而言之,您不应尝试一次理解所有这三个部分,首先应该了解这些组中的关系:
1.生命周期与阶段
生命周期是按顺序收集的阶段,请参见此处的生命周期参考。当您调用一个阶段时,它还将调用之前的所有阶段。
例如,清洁生命周期分为三个阶段(预清洁,清洁,后清洁)。
mvn clean
它将称为pre-clean和clean。
2.插件与目标
目标就像是Plugin中的一个动作。因此,如果plugin是一个类,目标是一种方法。
您可以这样设定目标:
mvn clean:clean
这意味着“在清理插件中调用清理目标”(这里与清理阶段无关。不要让“清理”一词使您感到困惑,因为它们不一样!)
3.现在,阶段与目标之间的关系:
阶段可以(预先)链接到目标。例如,通常,清洁阶段链接到清洁目标。因此,当您调用此命令时:
mvn clean
它将调用预清洁阶段和链接到clean: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:clean
目标:目标是阶段的目标
供参考 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
有以下三个内置的构建生命周期:
生命周期默认值 -> [验证,初始化,生成源,过程源,生成资源,过程资源,编译,过程类,生成测试源,过程测试源,生成测试资源,过程-test-resources,test-compile,process-test-classes,test,prepare-package,package,pre-integration-test,integration-test,post-integration-test,验证,安装,部署]
生命周期清洁 -> [预清洁,清洁,后清洁]
生命周期站点 -> [站点前,站点,后站点,站点部署]
该流程是顺序的,例如,对于默认生命周期,该流程以validate开头,然后进行初始化等等。
您可以通过启用的调试模式检查生命周期mvn
即mvn -X <your_goal>