2013-04-25 185 views
191

Maven目标和阶段之间有什么区别/关系?他们如何相互关联?什么是Maven的目标和阶段,它们有什么不同?

+3

问和[回答](http://stackoverflow.com/a/30953905/1744774)在[Maven:生命周期与阶段与插件与目标](http://stackoverflow.com/questions/26607834/maven-lifecycle-vs-phase-vs-plugin-vs-goal/)(再一次)。 – 2015-06-20 13:07:38

+1

[Maven:Lifecycle vs. Phase vs. Plugin vs. Goal]的可能重复(https:// stackoverflow。com/questions/26607834/maven-lifecycle-vs-phase-vs-plugin-vs-goal) – 2017-08-18 18:06:39

回答

155

目标分阶段执行,有助于确定订单目标的执行。对此的最佳理解是查看default Maven lifecycle bindings,其中显示哪些目标默认在哪些阶段运行。编译阶段目标将始终在测试阶段目标之前执行,而测试阶段目标将始终在软件包阶段目标等之前执行。混乱的

一部分的事实,当你执行的行家,你可以指定一个目标或阶段加剧。如果你指定了一个阶段,那么maven将运行所有阶段直到你按顺序指定的阶段(例如,如果你指定了包,它将首先运行整个编译阶段,然后是测试阶段,最后是包阶段),对于每个阶段它都会运行与该阶段相关的所有目标。

当你创建你的Maven构建文件中的插件运行您只需要指定目标,然后将这一目标结合给定的默认阶段。例如,jaxb:xjc目标默认绑定到生成资源阶段。但是,当您指定执行时,您也可以明确指定该目标的阶段。

如果指定当您执行的Maven然后将仍然运行各个阶段达到了这一目标的阶段目标。换句话说,如果您指定了jar目标,它将运行包阶段(以及这些阶段中的所有目标)的所有阶段,然后它将运行jar目标。

+3

我已经习惯于说“Maven **通过**所有阶段(直到并包括给定的)”而不是_“运行”_或_“执行”_(后者在Maven的_构建生命周期介绍中被调用)。这样就更加清楚了它实际执行的目标代码。但这可能是个人的品味。 – 2015-06-20 13:25:57

+0

但是我们也可以运行不属于任何阶段的目标,即'mvn archetype:generate',在这种情况下,maven只执行目标? – 2017-06-03 21:27:46

+0

检查最后一段。不,它不仅执行目标。 – Pace 2017-06-04 16:51:11

1

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

阶段:Maven的阶段是一组动作,其与2个或3个进球

〔实施例相关: - 如果你运行mvn干净

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

目标:Maven的目标与约束相

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

+4

它不一定是_“与2或3个目标相关”。它可以是_none_,_one_或_more_以及。 – 2015-06-20 13:29:25

24

个的定义在Maven site's page Introduction to the Build Lifecycle详细,但我试图summarize

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

  1. 生命周期

    三内置生命周期(又名构建生命周期):default,clean,site。 (Lifecycle Reference

  2. 每个生命周期是由,例如对于default生命周期:compile,test,package,install

  3. 插件

    提供一个或多个目标的神器。

    根据包装类型(jar,war等),插件的目标默认绑定到阶段。被执行(Built-in Lifecycle Bindings

  4. 目标

    任务(动作)。一个插件可以有一个或多个目标。

    configuring a plugin in a POM需要指定一个或多个目标。此外,如果插件没有定义默认阶段,则指定的目标可以绑定到阶段。

Maven可以与被调用:

  1. 一个相(例如cleanpackage
  2. <plugin-prefix>:<goal>(例如dependency:copy-dependencies
  3. <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 
+0

只有_lifecycle阶段_真的很有意义,被视为构建过程的_“步骤”_ 。我宁愿将它称为_4实体/物品/东西_。 – 2015-06-20 13:38:52

+0

当我看到世界“构建阶段”时,我认为它是生命周期中的另一个阶段,它让我感到困惑。 – 2017-06-03 21:36:48

31

选择的答案是伟大的,但我仍然想添加一些小的话题。一个例证。

它清楚地展示了不同阶段绑定到不同的插件以及这些插件所暴露的目标。

那么,让我们来看看运行像mvn compile的情况:

  • 这是一个阶段其执行编译插件与 编译目标
  • Compiler插件有不同的目标。对于mvn compile它被映射到一个特定的目标,即编译目标。
  • 这与运行mvn compiler:compile

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

enter image description here

链接到reference

+15

为什么'mvn test'指向'package','mvn install'指向'deploy'? – Abdull 2015-10-11 11:11:03

+2

看起来像一个插图错误,感谢您的注意(创建它在网络上)。 – Stas 2015-10-11 11:22:01

+3

你从哪里得到插图?你有没有检查版权和使用条款? – Abdull 2015-10-11 11:24:14

113

生命周期是一个名为阶段的序列。
阶段顺序执行。执行阶段意味着执行所有先前的阶段。

插件是目标也称为MOJO集合(中号 Aven的ö LD Ĵ AVA ö bject)。类比:插件是一个类,目标是类中的方法。

Maven的是围绕构建生命周期的核心概念。
有三个内置构建生命周期:

  1. 默认
  2. 干净
  3. 网站

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.

A建筑阶段的maven-plugin-plugin配置参数由Plugin目标

大多数Maven的功能是在插件最多。一个插件提供了一组目标,可以使用以下语法执行:

mvn [plugin-name]:[goal-name] 

例如,Java项目可以与编译器插件的编译目标运行mvn compiler:compile编译。

构建生命周期是一个命名阶段列表,可用于命令执行目标。

插件提供的目标可以与生命周期的不同阶段相关联。例如,默认情况下,目标compiler:compilecompile相关联,而目标surefire:testtest相关联。考虑下面的命令:

mvn test 

当执行上述命令时,Maven运行与每个相直到并包括所述相test的相关联的所有目标。在这种情况下,Maven运行与process-resources阶段相关的resources:resources目标,然后运行compiler:compile,依此类推,直到它终于运行surefire:test目标。

但是,即使构建阶段负责构建生命周期中的特定步骤,但它履行这些责任的方式可能会有所不同。这是通过声明插件目标绑定到这些构建阶段来完成的。

插件目标代表了一个特定的任务(比构建阶段更精细),有助于项目的构建和管理。它可能会被绑定到零或更多的构建阶段。不受任何构建阶段限制的目标可以通过直接调用在构建生命周期之外执行。执行顺序取决于调用目标和构建阶段的顺序。例如,请考虑下面的命令。 cleanpackage参数是构建阶段,而dependency:copy-dependencies是目标(的插件)。

mvn clean dependency:copy-dependencies package 

如果这是要执行的clean阶段将首先执行(这意味着它将运行clean生命周期的所有前面的阶段,再加上clean阶段本身),然后dependency:copy-dependencies目标,最后才执行package阶段(以及默认生命周期的所有前面的构建阶段)。此外,如果一个目标必须与一个或多个构建阶段绑定,那么这个目标将在所有这些阶段中被调用。

此外,构建阶段也可以有零个或多个目标绑定到它。如果构建阶段没有绑定的目标,那么构建阶段将不会执行。但是,如果它有一个或多个目标绑定到它,它将执行所有这些目标。

Built-in Lifecycle Bindings
某些阶段有默认绑定到他们的目标。而对于默认生命周期,这些绑定取决于包装值。

Maven的架构:

enter image description here

Reference 1
Reference 2

+0

优秀的解释! – 2016-10-03 09:31:47

+0

如果我有2个配置文件,我可以先运行配置文件1的所有插件,然后再运行配置文件2的插件吗? – Bee 2016-12-19 12:07:44

+0

简单解释.. – 2017-05-31 15:17:45

5

感谢桑迪普金达莱和Premraj。他们的解释有助于我在困惑了一段时间之后才明白。

我创建了一些完整的代码示例&这里有一些简单的解释https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我认为这可能有助于他人理解。

在从链接短,你不应该试着去了解所有三个同时,首先应该了解这些群体的关系:VS阶段

  • 生命周期
  • 插件VS目标

1.生命周期VS阶段

生命周期阶段的集合,顺序请参阅Life Cycle References。当您拨打阶段时,它还会在之前呼叫所有阶段

例如,具有3个阶段的清洁生命周期(预清洁,清洁,后清洁)。

mvn clean 

它将调用预清洁干净

2.插件VS目标

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

你可以调用这样一个目标:

mvn clean:clean 

这意味着“调用干净的目标,在清理插件”(没有涉及到清理阶段在这里,不要让“清洁”字样迷惑你,他们是不一样的)

3.现在阶段&目标之间的关系:

阶段可以(预)链接目标(s)。例如,通常,清洁阶段链接到干净的目标。所以,当你调用这个命令:

mvn clean 

它将调用预先清理阶段和清理阶段,其链接到清洁:清洁的目标。

这几乎是一样的:

mvn pre-clean clean:clean 

的更多细节和充分的例子是https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

相关问题