Maven目标和阶段之间的区别/关系是什么?它们之间有什么关系?


当前回答

有以下三个内置的构建生命周期:

默认的 清洁 网站

生命周期默认值->[验证、初始化、生成源、流程源、生成资源、流程资源、编译、流程类、生成测试源、流程测试源、生成测试资源、流程测试资源、测试编译、流程测试类、测试、准备包、包、预集成测试、集成测试、后集成测试、验证、安装、部署]

生命周期清洁->[预清洁,清洁,后清洁]

生命周期站点->[站点前,站点,站点后,站点部署]

流是顺序的,例如,对于默认的生命周期,它从验证开始,然后初始化等等…

您可以通过启用mvn的调试模式来检查生命周期,即mvn -X <your_goal>

其他回答

目标是分阶段执行的,这有助于确定目标执行的顺序。最好的理解方法是查看默认的Maven生命周期绑定,该绑定显示默认情况下哪个目标在哪个阶段运行。编译阶段目标总是在测试阶段目标之前执行,测试阶段目标总是在包阶段目标之前执行,以此类推。

执行Maven时可以指定目标或阶段,这在一定程度上加剧了这种混乱。如果您指定了一个阶段,那么Maven将运行所有阶段,直到您指定的阶段(例如,如果您指定了包,它将首先运行编译阶段,然后是测试阶段,最后是包阶段),并且对于每个阶段,它将运行与该阶段相关的所有目标。

当您在Maven构建文件中创建插件执行时,如果您只指定了目标,那么它就会将该目标绑定到给定的默认阶段。例如,jaxb:xjc目标默认绑定到生成资源阶段。但是,当您指定执行时,您还可以显式地指定该目标的阶段。

如果您在执行Maven时指定了一个目标,那么它将运行该目标,且仅运行该目标。换句话说,如果您指定了jar:jar目标,它将只运行jar:jar目标来将您的代码打包到一个jar中。如果您之前没有运行编译目标或以其他方式准备编译后的代码,则很可能会失败。

具有阶段和目标的Maven工作术语。

阶段:Maven阶段是一组与2或3个目标相关的行动

示例:-如果您运行MVN清洁

这是MVN阶段要执行的清洁目标:清洁

目标:与阶段有界限的Maven目标

供参考 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

这些定义在Maven站点的构建生命周期介绍页面中有详细说明,但是我已经尝试总结:

Maven定义了构建过程的4项:

Lifecycle Three built-in lifecycles (aka build lifecycles): default, clean, site. (Lifecycle Reference) Phase Each lifecycle is made up of phases, e.g. for the default lifecycle: compile, test, package, install, etc. Plugin An artifact that provides one or more goals. Based on packaging type (jar, war, etc.) plugins' goals are bound to phases by default. (Built-in Lifecycle Bindings) Goal The task (action) that is executed. A plugin can have one or more goals. One or more goals need to be specified when configuring a plugin in a POM. Additionally, in case a plugin does not have a default phase defined, the specified goal(s) can be bound to a phase.

Maven可以通过以下方式调用:

阶段(如清洁、打包) <plugin-prefix>:<goal>(例如: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编译,它被映射到一个特定的目标,编译目标。 这与运行mvn编译器:compile相同

因此,阶段是由插件目标组成的。

链接到参考资料

关于佩斯的回答,

如果您在执行Maven时指定了一个目标,那么它将运行该目标,且仅运行该目标。换句话说,如果您指定了jar:jar目标,它将只运行jar:jar目标来将您的代码打包到一个jar中。

这种说法有一个例外。Maven插件API允许目标触发生命周期阶段的执行。

考虑以下项目:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>simple-maven-project</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
</project>

当你执行spring-boot-maven-plugin中定义的目标运行时

mvn org.springframework.boot:spring-boot-maven-plugin:run

它打印

[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\main\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO] 
[INFO] 
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------

这是因为spring-boot-maven-plugin-X.X.X.jar/META-INF/maven/plugin.xml中的目标定义包含<executePhase>test-compile</executePhase>,它执行test-compile和所有前面的阶段。

<mojo>
    <goal>run</goal>
    (...)
    <executePhase>test-compile</executePhase>
    (...)
</mojo>

此外,由于“jar”打包的默认绑定,很少执行其他目标。如果将打包更改为“pom”,则相同的命令将生成

[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO] 
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO] 
[INFO] 
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------

因为对于test-compile或任何之前的阶段和此打包类型没有默认绑定。