Maven目标和阶段之间有什么区别/关系?它们是如何相互关联的?
8 回答
Goals are executed in phases which help determine the order goals get executed in. The best understanding of this is to look at the default Maven lifecycle bindings which shows which goals get run in which phases by default. The compile
phase goals will always be executed before the test
phase goals, which will always be executed before the package
phase goals and so on.
Part of the confusion is exacerbated by the fact that when you execute Maven you can specify a goal or a phase. If you specify a phase then Maven will run all phases up to the phase you specified in order (e.g. if you specify package it will first run through the compile phase and then the test phase and finally the package phase) and for each phase it will run all goals attached to that phase.
When you create a plugin execution in your Maven build file and you only specify the goal then it will bind that goal to a given default phase. For example, the jaxb:xjc
goal binds by default to the generate-resources
phase. However, when you specify the execution you can also explicitly specify the phase for that goal as well.
If you specify a goal when you execute Maven then it will run that goal and only that goal. In other words, if you specify the jar:jar
goal it will only run the jar:jar
goal to package your code into a jar. If you have not previously run the compile goal or prepared your compiled code in some other way this may very likely fail.
生命周期是一系列命名阶段。
阶段按顺序执行。执行一个阶段意味着执行所有先前的阶段。插件是一个目标集合,也称为 MOJO(M aven O ld J ava O 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
但是,如果要自定义用于引用插件的前缀,可以直接通过插件 POMmaven-plugin-plugin
中的配置参数指定前缀。
构建阶段由插件目标组成
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 示例
这些定义在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
选择的答案很棒,但我仍然想为这个主题添加一些小东西。插图。
它清楚地展示了不同阶段如何绑定到不同的插件以及这些插件公开的目标。
因此,让我们检查一个运行类似的案例mvn compile
:
- 这是一个执行带有编译目标的编译器插件的阶段
- 编译器插件有不同的目标。因为
mvn compile
它映射到一个特定的目标,即编译目标。 - 和跑步一样
mvn compiler:compile
因此,阶段由插件目标组成。
链接到参考
归功于 Sandeep Jindal 和 Premraj。在对此感到困惑一段时间后,他们的解释帮助我理解。
我在这里创建了一些完整的代码示例和一些简单的解释https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我认为这可能有助于其他人理解。
简而言之,从链接中,您不应该试图同时了解所有三个,首先您应该了解这些组中的关系:
- 生命周期与阶段
- 插件与目标
1. 生命周期与阶段
Life Cycle是按顺序排列的阶段的集合,请参见此处Life Cycle References。当你调用一个阶段时,它也会调用它之前的所有阶段。
例如,清洁生命周期有 3 个阶段(清洁前、清洁、清洁后)。
mvn clean
它将调用pre-clean和clean。
2. 插件与目标
目标就像Plugin中的一个动作。所以如果插件是一个类,那么目标就是一个方法。
你可以这样称呼一个目标:
mvn clean:clean
这意味着“在 clean 插件中调用 clean 目标”(这里与 clean 阶段无关。不要让“clean”这个词混淆你,它们是不一样的!)
3. 现在阶段和目标之间的关系:
阶段可以(预)链接到目标。例如,通常,清洁阶段链接到清洁目标。因此,当您调用此命令时:
mvn clean
它将调用 pre-clean 阶段和链接到 clean:clean 目标的 clean 阶段。
它几乎与以下内容相同:
mvn pre-clean clean:clean
更多详细信息和完整示例在https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
具有阶段和目标的 Maven 工作术语。
阶段:Maven阶段是一组与2或3个目标相关的动作
示例:- 如果您运行 mvn clean
这是执行目标 mvn clean:clean 的阶段
目标:Maven 目标以阶段为界
供参考 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、verify、install、deploy]
Lifecycle clean -> [pre-clean, clean, post-clean]
生命周期站点-> [站点前、站点、站点后、站点部署]
流程是顺序的,例如,对于默认生命周期,它从validate开始,然后进行初始化等等......
mvn
您可以通过启用ie的调试模式来检查生命周期,mvn -X <your_goal>