Maven目标和阶段之间有什么区别/关系?他们是如何相互关联的?
答案 0 :(得分:214)
目标分阶段执行,有助于确定执行的订单目标。最好的理解是查看default Maven lifecycle bindings,它显示默认情况下哪些目标在哪些阶段运行。编译阶段目标将始终在测试阶段目标之前执行,这将始终在程序包阶段目标之前执行,等等。
当您执行maven时,您可以指定目标或阶段,从而加剧了部分混乱。如果你指定一个阶段,那么maven将运行所有阶段直到你按顺序指定的阶段(例如,如果你指定包,它将首先运行在编译阶段,然后是测试阶段,最后是包阶段),对于每个阶段,它将运行与该阶段相关的所有目标。
当您在Maven构建文件中创建插件执行并且只指定目标时,它会将该目标绑定到给定的默认阶段。例如,jaxb:xjc目标默认绑定到generate-resources阶段。但是,当您指定执行时,您也可以明确指定该目标的阶段。
如果您在执行Maven时指定了目标,那么它仍将运行所有阶段直到达到该目标的阶段。换句话说,如果你指定jar目标,它将运行所有阶段直到包阶段(以及那些阶段中的所有目标),然后它将运行jar目标。
答案 1 :(得分:159)
生命周期是一系列命名的阶段 阶段按顺序执行。执行阶段意味着执行所有先前的阶段。
插件是目标的集合,也称为MOJO( M aven O ld J ava 0 强> bject)。
打个比方:插件是一个类,目标是类中的方法。
Maven基于构建生命周期的核心概念。在每个构建生命周期中,有构建阶段,并且在每个构建阶段内部都有构建目标。
我们可以执行构建阶段或构建目标。在执行构建阶段时,我们在该构建阶段执行所有构建目标。构建目标分配给一个或多个构建阶段。我们也可以直接执行构建目标。
有三个主要的内置构建生命周期:
Each Build Lifecycle is Made Up of Phases
例如,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
但是,如果要自定义用于引用插件的前缀,可以直接通过plugin's POM.
中maven-plugin-plugin
上的配置参数指定前缀
构建阶段由Plugin目标
组成Maven的大部分功能都在插件中。插件提供了一组目标,可以使用以下语法执行:
mvn [plugin-name]:[goal-name]
例如,可以通过运行mvn compiler:compile
使用编译器插件的编译目标编译Java项目。
构建生命周期是一个命名阶段列表,可用于为目标执行命令。
插件提供的目标可以与生命周期的不同阶段相关联。例如,默认情况下,目标 compiler:compile
与{{ 1}} 阶段,而目标 compile
与surefire:test
阶段相关联。请考虑以下命令:
test
当执行上述命令时,Maven将运行与每个阶段相关的所有目标,直至并包括mvn test
阶段。在这种情况下,Maven会运行与test
阶段相关联的resources:resources
目标,然后是process-resources
,依此类推,直到最终运行compiler:compile
目标。
但是,即使构建阶段负责构建生命周期中的特定步骤,它执行这些职责的方式也可能不同。这是通过声明绑定到那些构建阶段的插件目标来完成的。
插件目标代表一个特定任务(比构建阶段更精细),它有助于构建和管理项目。它可能绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。执行顺序取决于调用目标和构建阶段的顺序。例如,请考虑以下命令。 surefire:test
和clean
参数是构建阶段,而package
是目标(插件)。
dependency:copy-dependencies
如果要执行此操作,将首先执行mvn clean dependency:copy-dependencies package
阶段(意味着它将运行整个生命周期的所有前几个阶段,加上clean
阶段本身),然后clean
阶段1}}目标,在最终执行dependency:copy-dependencies
阶段(以及默认生命周期的所有前面构建阶段)之前。
此外,如果目标绑定到一个或多个构建阶段,则将在所有这些阶段调用该目标。
此外,构建阶段也可以有零个或多个绑定目标。如果构建阶段没有绑定目标,则不会执行该构建阶段。但如果它有一个或多个与之绑定的目标,它将执行所有这些目标。
<强> Built-in Lifecycle Bindings 强>
默认情况下,某些阶段的目标与它们绑定。对于默认生命周期,这些绑定取决于包装值。
Maven Architecture:
Maven生命周期映射的Eclipse示例
答案 2 :(得分:37)
Maven site's page Introduction to the Build Lifecycle详细说明了这些定义,但我尝试summarize:
Maven定义了构建过程的4个项目:
<强>生命周期强>
三个内置生命周期(又名构建生命周期):default
,clean
,site
。 (Lifecycle Reference)
<强>阶段强>
每个生命周期由阶段组成,例如对于default
生命周期:compile
,test
,package
,install
等。
<强>插件强>
提供一个或多个目标的工件。
基于打包类型(jar
,war
等),插件的目标默认绑定到阶段。 (Built-in Lifecycle Bindings)
<强>目标强>
执行的任务(动作)。插件可以有一个或多个目标。
configuring a plugin in a POM时需要指定一个或多个目标。此外,如果插件没有定义默认阶段,则指定的目标可以绑定到阶段。
可以使用:
调用Mavenclean
,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
答案 3 :(得分:36)
选择的答案很棒,但我仍想在主题中添加一些小内容。插图。
它清楚地展示了不同阶段与不同插件的结合以及这些插件所暴露的目标。
所以,让我们来看一下运行像mvn compile
:
mvn compile
,它映射到特定目标,即编译目标。mvn compiler:compile
因此,阶段由插件目标组成。
链接到reference
答案 4 :(得分:6)
归功于Sandeep Jindal和Premraj。他们的解释让我在对此感到困惑之后能够理解一段时间。
我创建了一些完整的代码示例&amp;这里有一些简单的解释https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我认为这可能有助于其他人理解。
简而言之,您不应该尝试同时理解所有三个,首先您应该了解这些群体中的关系:
<强> 1。生命周期与阶段
生命周期依次是阶段的集合,请参阅此处Life Cycle References。当您拨打阶段时,它也会调用之前的所有阶段。
例如,清洁生命周期有3个阶段(预清洁,清洁,后清洁)。
mvn clean
它会调用预清洁和清理。
<强> 2。插件与目标
目标就像插件中的操作一样。因此,如果插件是一个类,则目标是一种方法。
你可以这样打个目标:mvn clean:clean
这意味着“在干净的插件中调用干净的目标”(这里没有涉及干净的阶段。不要让“干净”这个词让你感到困惑,它们不一样!)
第3。现在Phase&amp;的关系目标强>
阶段可以(预)链接到目标。例如,通常情况下,干净阶段会链接到干净的目标。所以,当你调用这个命令时:
mvn clean
它将调用预清洁阶段和清洁阶段,该阶段与清洁目标相关联。
几乎与:
相同mvn pre-clean clean:clean
更多细节和完整示例位于https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
答案 5 :(得分:6)
答案 6 :(得分:2)
Maven工作术语有阶段和目标。
阶段:Maven阶段是一组与2或3个目标相关联的行动
exmaple: - 如果你运行mvn clean
这是阶段将执行目标mvn clean:clean
目标:Maven的目标与阶段
有关供参考 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
答案 7 :(得分:1)
有以下三个内置的构建生命周期:
生命周期默认值-> [验证,初始化,生成源,流程源,生成资源,流程资源,编译,流程类,生成测试源,流程测试源,生成测试资源,过程测试资源,测试编译,过程测试类,测试,准备打包,打包,集成前测试,集成测试,集成后测试,验证,安装,部署]
生命周期清洁-> [预清洁,清洁,后清洁]
生命周期站点-> [站点前,站点,站点后,站点部署]
该流是顺序的,例如,对于 default 生命周期,它从 validate 开始,然后是 initialize ,依此类推... / p>
您可以通过启用mvn
即mvn -X <your_goal>
的调试模式来检查生命周期