Maven: 生命周期 vs 阶段 vs 插件 vs 目标

这里的开发人员相对较新,尽管我已经使用它一段时间了,但我希望巩固我的 Maven 基础。我的部分问题是我有使用 Ant 的 no经验,这似乎是许多解释的来源。我一直在阅读和观看教程,我一直听到同样的术语:

  • 生命周期
  • 阶段
  • 插件
  • 进球了

据我所知,生命周期似乎是最广泛的,由阶段、插件和/或目标组成(或完成)。

问题 : 您能否提供一些关于这些术语如何关联以及最常见的例子的信息?

The more explicit and basic, the better!

56278 次浏览

因此,进一步解释一下概述 here

Maven 构建在生命周期中是分开的,这些是:

  • 干净
  • Build (默认值)
  • 工地

每个周期都被划分为不同的阶段。 For instance build is split into phases like:

  • 准备资源
  • 编译
  • 包裹
  • 安装

阶段的目标是在 之前或 之后运行一个阶段,例如:

  • 将在清洁阶段之前执行
  • 清洁后-将在清洁阶段之后执行

如果你愿意,你可以把目标看作额外的“插入”阶段。 详细阅读 给你或者看看 @ Gerold 回答

玛文的生命周期是一个(抽象的)概念,涵盖了所有 步骤(或者更好: Maven 设计师决定支持的所有步骤) that are expected to occur in a project's development lifetime.。这些步骤(或阶段)在 Maven 术语中是 称为「环境影响评估」

一个 Maven 插件是一个容器/供应商的 目标。代码实现的目标是真正的主力。(Maven 的核心就是管理插件和执行目标)

当调用 mvn <phase> Maven passes all phases(每次) 执行所有的目标(由插件提供) 都与任何阶段有关之前和(包括)给定的阶段。如果有一个没有目标约束的阶段,那么什么也不做。但是这个阶段已经过去了。

也就是说,你不能 "'insert' additional phases"进入 Maven 的内置生命周期(干净违约工地)。他们已经在那里了,一直都在!您可以使用自己的阶段开发您自己的生命周期,但是这远远超过了简单地使用 Maven。

目标也可以直接执行,当你在没有任何阶段或(插件:)目标的情况下运行 mvn时,你会得到这样的提示:

You must specify a valid lifecycle phase or a goal in the format


<plugin-prefix>:<goal> or


<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.


Available lifecycle phases are:


...

... 见下面 参考文献的实际输出或 Maven,构建生命周期简介

参考文献

Maven: 生命周期 vs 阶段 vs 插件 vs 目标

为了澄清这个线程中缺少的另一个粒度级别: 处决(目标) ,这是 Maven 构建中最小的单位。

因此,我们有 建造循环(基本上是针对特定总体目标的一组操作) ,它由 阶段(较低的粒度,一个循环步骤)组成,可以调用某个 插件提供的一组配置好的 目标。也就是说,Maven 也是一个插件执行者,每个插件可以提供一个或多个目标。然后您(也)决定哪个目标附加到哪个阶段,大多数时候在缺省生命周期(没有任何,也就是缺省)。但是你实际上可以有另外一个层次: 执行(同一个目标,来自同一个插件,或者来自不同插件的不同目标)

我准备了一张照片来重现 enter image description here

事实上,Maven 是这样通过构建日志中唯一的字符串显示它(它的最小工作单元)的:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

例如,我们会:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

这实际上意味着(通过不同的粒度级别) :

  • compile阶段(不幸的是只在 mvn -X ...调试时提到,在 REACTOR BUILD PLAN – Tasks: [...]下)→
  • 我正在调用 Maven 编译器插件(由 artifactIdversion指定) ,目标是 compile
  • executionid default-compile定义。

它之所以独一无二,是因为您确实可以将相同的目标(同一个插件)绑定到不同的阶段或同一阶段,但执行方式不同(即使用不同的配置)。例如,在 test-compile(一个不同的阶段)期间,也使用 maven-compiler-plugin在不同的执行(default-testCompile)中编译测试代码(通过其 testCompile目标)。您还可以(使用相同的插件和目标)在 POM 中指定的执行所定义的不同阶段中编译一些自动生成的代码(可能还有不同的配置)。

默认执行是通过 美芬包装装订提供的,也就是说,默认情况下(强制执行约定优于配置) Maven 在某些阶段已经调用了某些目标(标准插件)。这些默认调用的执行 id 是根据 某些惯例定义的。

这也解释了为什么如果您真的想覆盖 Maven 构建的默认行为(绑定) ,您需要在 POM 中为同一个插件指定(覆盖)完全相同的执行 ID。例如,您可以跳过编译,简单地用相同的 default-compile id 定义 maven-compiler-plugin的执行,但是绑定到一个不存在的阶段(或者一个空阶段)。

简而言之 : 执行告诉 Maven 在哪个阶段使用哪个配置执行哪个目标。

一些执行是默认提供的(defaulbindings) ,这解释了为什么只有 6行的 Maven 最小的彩票已经可以做很多事情(编译、测试、打包等) : 在某些阶段执行标准插件的目标: 它是约定优于配置的。然后,通过 pom.xml配置,您可以将 东西(执行)添加到构建中,或者影响已经配置的插件的行为(在这种情况下,没有 executions部分,但只有 configuration就足够了)。

是的,您可以跳过构建周期(及其阶段) ,直接调用(插件的)目标:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(注意: 您也可以只在一个调用中内联调用)

在这里,我们编译应用程序代码,测试代码,执行测试和包: 想象一下这将是多么手动,容易出错,重复和耗时。约定优于配置帮助我们: Maven 引入了 build 生命周期和 阶段。默认生命周期(没有名称,即默认生命周期)根据最佳实践和约定(Maven 的箴言)提供了一系列阶段。
如果你想达到同样的上述,只需运行: mvn package,它将自动编译,测试和打包您的项目。怎么做到的?调用插件。也就是说,阶段是有意义的和可配置的一组插件(目标)执行。为了使它更加标准,对于每个阶段,Maven 将首先调用前面的任何阶段,因此,例如,如果你想测试,你将确保你首先编译。

注意,当为同一个 execution指定多个目标时,您仍然可以在构建日志中清楚地看到针对两个不同目标(因此,仍然是唯一的 tuple)的两次不同执行(使用相同的 id)。

感谢 Sandeep Jindal 和 Premraj (从这里 Maven 的目标和阶段是什么,它们之间的区别是什么?)。他们的解释帮助我理解。

我在这里创建了一些完整的代码示例和一些简单的解释 https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我认为它可以帮助别人理解,并可以直接尝试一些东西。

In short from the link, You should not try to understand all three at once, first you should understand the relationship in these groups:

  • Life Cycle vs Phase
  • 插件 VS 目标

1. 生命周期与阶段

生命周期 阶段序列的集合,参见这里的 生命周期参考文献。当你调用一个 阶段时,它也会调用它之前的所有 阶段

For example, the 清洁生命周期 has 3 phases (清洁前,清洁后,清洁后).

mvn clean

它将调用 预清理干净

插件 VS 目标

目标 就像是 插件中的一个动作,所以如果插件是一个类,那么目标就是一个方法。

你可以这样称呼一个目标:

mvn clean:clean

这意味着“在干净的插件中调用干净的目标”(这里没有任何东西与干净的阶段相关。不要让“干净”这个词迷惑了你,它们是不一样的!在我上面的链接中可以看到完整的解释)

3. 阶段与目标的关系:

阶段 can (pre)链接到 进球了(s)。例如,通常情况下,清洁阶段链接到清洁目标。因此,当您调用这个命令时:

mvn clean

它将称之为预清洁阶段和与清洁: 清洁目标相联系的清洁阶段。

这几乎与:

mvn pre-clean clean:clean

来自 这个很好的教程:

生命周期、生命周期阶段、插件和插件目标是 Maven 的核心。

  • Maven 命令 快点只接受生命周期阶段或插件目标作为参数。
  • Maven 有三个生命周期: 默认、干净和站点。
  • Each lifecycle is made up of lifecycle phases and in all, there are 28 phases – 拖欠21美元 (验证,... ,编译,... ,包,... ,安装,部署), 3 in clean (pre-clean, clean, post-clean) and 4人就位 (现场前,现场,现场后,现场部署).
  • 当使用 mvn命令调用生命周期阶段时,所有前面的阶段都将依次执行。
  • 生命周期阶段本身不具备完成任何任务的能力,它们依赖于插件来执行任务。
  • 根据项目和包装类型,Maven 将各种插件目标绑定到生命周期阶段和目标执行委托给他们的任务。

当我们在 Java 项目中运行 mvn package时,Maven 将插件目标绑定到生命周期阶段,如下图所示:

mvn-plugins-package-goal

And belatedly another diagram

  • 生命周期为黄色矩形
  • 生命周期的相位 为蓝色矩形 深蓝色的“ callable” 阶段(也就是说,带有连字符的阶段通常不会从命令行调用,因为它们的设计可能不会使项目处于定义良好的状态)。
  • 蓝色含片。显示的关联/绑定“ stage-> 目标”是“ jar”包装模式之一。每个阶段都有与之相关的目标。这当然适用于每个生命周期,尽管绑定只在“默认”生命周期中显示。
  • Plugins as grey clipped rectangles. Plugins provide the Goals that can be bound to the Phases.

Maven Lifecycles, Phases, Goals, Plugins

生命周期与阶段: Life Cyclephases的集合。当你调用一个阶段时,它也会调用它之前的所有阶段。 Maven comes with 3 built-in build life cycles as:

  1. 清理生命周期-这包括清理项目(对于新的构建和部署)
  2. 默认/构建生命周期——它处理项目的完整部署
  3. 站点生命周期-处理生成项目的 java 文档。 enter image description here

清洁生命周期分为三个阶段: 清洁前、清洁和清洁后。默认阶段和站点生命周期阶段如图所示。