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

评论

在Maven中进行询问和回答:生命周期vs.阶段vs.插件vs.目标(还有一次)。

Maven的可能重复项:生命周期,阶段,插件,目标

#1 楼

目标是分阶段执行的,有助于确定目标的执行顺序。对此的最佳理解是查看默认的Maven生命周期绑定,该绑定显示默认情况下哪些目标在哪个阶段运行。 compile阶段目标将始终在test阶段目标之前执行,始终在package阶段目标之前执行,依此类推。
当您执行Maven时可以指定一个目标或阶段。如果指定一个阶段,则Maven将按顺序运行所有阶段,直到您指定的阶段为止(例如,如果指定软件包,它将首先运行编译阶段,然后是测试阶段,最后是软件包阶段),并且对于每个阶段,运行该阶段附带的所有目标。
当您在Maven构建文件中创建插件执行并且仅指定目标时,它将将该目标绑定到给定的默认阶段。例如,默认情况下,jaxb:xjc目标绑定到generate-resources阶段。但是,当您指定执行时,您也可以显式指定该目标的阶段。
如果在执行Maven时指定目标,则它将运行该目标,并且仅运行该目标。换句话说,如果指定了jar:jar目标,它将仅运行jar:jar目标以将您的代码打包到jar中。如果您以前没有运行过编译目标或以其他方式准备了已编译的代码,则很可能会失败。

评论


我习惯说“ Maven通过所有阶段(直到给定并包括给定的阶段)”,而不是“运行”或“执行”(后者在Maven的《构建生命周期简介》中被称为)。这样与实际执行的目标代码更加不同。但这可能是个人喜好。

– Gerald Broser
2015年6月20日13:25



但是我们也可以运行不属于任何阶段的目标,即mvn archetype:generate,在这种情况下,maven仅执行目标?

– Quazi Irfan
17年6月3日在21:27

@Pace您是否有最后一段的参考?我一直对此表示怀疑,并在此处通过一个简单的项目进行了尝试:mvn测试运行:--- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ...- -maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test,而mvn编译器:testCompile只是运行--- maven-compiler-plugin:3.1:testCompile ....

– Gerald Broser
18-2-3在18:01



@Pace mvn clean编译器:testCompile运行--- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile失败,执行目标org.apache.maven.plugins失败:项目mvnphase上的maven-compiler-plugin:3.1:testCompile(default-cli):编译失败...找不到符号...符号:变量MvnPhase(其中MvnPhase是测试类中引用的被测类)。显然,如果明确调用目标,则不会调用阶段。

– Gerald Broser
18年2月4日在11:08

基于geroldbroser和@ kekko12的输入,我更新了最后一段,指出当指定目标时,仅运行该目标,而不是所有先前阶段。

–步伐
19/12/27在18:13

#2 楼


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

插件是目标的集合,也称为MOJO(Maven旧Java对象)。
类比:插件是一个类,目标是该类中的方法。


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  


但是,如果您要自定义用于引用的前缀您的插件,您可以直接通过插件的POM中maven-plugin-plugin上的配置参数指定前缀。

构建阶段由插件目标组成

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

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


例如,可以使用编译器插件的compile-goal编译Java项目。通过运行mvn compiler:compile

构建生命周期是可用于为目标执行分配顺序的已命名阶段的列表。

插件提供的目标可以与生命周期的不同阶段关联。例如,默认情况下,目标compiler:compilecompile阶段关联,而目标surefire:testtest阶段关联。考虑以下命令:当执行前面的命令时,Maven将运行与每个阶段相关的所有目标,直到test阶段为止。在这种情况下,Maven先运行与resources:resources阶段关联的process-resources目标,然后运行compiler:compile,依此类推,直到最终运行surefire:test目标。

但是,即使构建阶段负责特定的任务,也是如此。在构建生命周期的步骤中,其执行这些职责的方式可能会有所不同。这是通过声明与这些构建阶段绑定的插件目标来完成的。

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

mvn test


如果要执行,则clean阶段将是首先执行(意味着它将运行干净生命周期的所有先前阶段,以及clean阶段本身),然后执行dependency:copy-dependencies目标,然后最终执行package阶段(以及默认生命周期的所有先前构建阶段)。

此外,如果目标绑定到一个或多个构建阶段,则在所有这些阶段都将调用该目标。

此外,构建阶段还可以绑定零个或多个目标。如果构建阶段没有目标绑定,则该构建阶段将不会执行。但是,如果绑定了一个或多个目标,它将执行所有这些目标。

内置生命周期绑定
默认情况下,某些阶段具有绑定到其上的目标。对于默认生命周期,这些绑定取决于包装值。

Maven体系结构:



参考文献1参考文献2

用于Maven生命周期映射的Eclipse示例



评论


如果我有2个配置文件,是否可以先运行配置文件1的所有插件,然后再运行配置文件2的所有插件?

–蜜蜂
16/12/19在12:07



示例mvn [plugin-name]:[goal-name]中的[plugin-name]只是一个插件前缀。 mvn全新安装不仅可以“在多模块方案中使用”。多模块是一个完全不同的主题。

– Gerald Broser
18年2月3日,19:01



同一阶段附加的目标是否遵守任何顺序?

–鳗鱼ghEEz
18年3月21日在19:13

这些文本大部分都是从Maven文档中逐字复制的。这应该明确说明!

– Lii
18年6月7日在11:01



很棒的消息来源!

– Bobo
19年6月7日在13:24

#3 楼

选择的答案很好,但是我仍然想在主题中添加一些小东西。一个例子。

它清楚地说明了不同的阶段如何绑定到不同的插件以及这些插件暴露的目标。

因此,让我们研究一下运行类似mvn compile的情况:


这是一个执行编译器插件的阶段,其中
编译目标

编译器插件有不同的目标。对于mvn compile,它已映射到特定目标,即编译目标。
与运行mvn compiler:compile相同,因此,阶段由插件目标组成。



链接到参考文献

评论


为什么mvn test指向软件包,而mvn install指向部署?

–阿卜杜勒(Abdull)
15年10月11日在11:11

看起来像是插图错误,感谢您的注意(在网络上发现了它)。

–约翰尼
2015年10月11日,11:22

你从哪里得到插图的?您检查版权和使用条款了吗?

–阿卜杜勒(Abdull)
2015年10月11日,11:24

@abdull图像从这里拍摄carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/…(并且它也出现在许多其他网页中)添加到了答案中。感谢您提出这一点,并没有意识到这一点的重要性。

–约翰尼
16年1月13日在10:45



图中从阶段到插件的指针也不完全正确,jar插件实际上在程序包阶段运行。阶段和插件之间的pom有点混乱(我认为这意味着在pom中,除了默认绑定之外,您还可以配置哪些插件在哪个阶段中运行)。不过,一般原则是正确的。

–亚历山大·克里姆采切克(Alexander Klimetschek)
17 Dec 8'在19:21



#4 楼

有关定义的详细信息,请参见Maven站点的“构建生命周期简介”页面,但我尝试总结一下:

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



生命周期

三个内置生命周期(又称构建生命周期):defaultcleansite。 (生命周期参考)


阶段

每个生命周期都由阶段组成,例如对于default生命周期:compiletestpackageinstall等。


插件

提供一个或多个目标的工件。

根据包装类型(jarwar等),默认情况下,插件的目标绑定到阶段。 (内置生命周期绑定)


目标

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

在POM中配置插件时,需要指定一个或多个目标。此外,如果未定义默认阶段的插件,则可以将指定的目标绑定到阶段。


可以使用以下方式调用Maven:


相(例如cleanpackage

<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


评论


只有生命周期阶段才有意义,可以将其视为(构建过程的)“步骤”。我宁愿称其为4个实体/项目/事物。

– Gerald Broser
2015年6月20日在13:38



当我看到世界构建阶段时,我将其视为生命周期中的另一个阶段,这使我感到困惑。

– Quazi Irfan
17年6月3日在21:36

好答案。小注释:关于最后一节“可以使用Maven调用”,有第四个选项(自Maven 3.3.1起),它是plugin:goal @ executation_id,例如。 mvn antrun:run @ my-execution参见stackoverflow.com/questions/3166538/…

– Eliyahu Machluf
20 Dec 10'20:35



#5 楼

我相信已经提供了一个很好的答案,但是我想添加一个易于理解的图表,其中包含3个生命周期(buildcleansite)以及每个阶段的相位。



粗体阶段是常用的主要阶段。

评论


generate-resources出现两次,而generate-sources丢失。

–elingerojo
19 Mar 6 '19 at 2:32

#6 楼

归功于Sandeep Jindal和Premraj。他们的解释让我在困惑了一段时间后理解了。

我在这里创建了一些完整的代码示例和一些简单的解释,https://www.surasint.com/maven-life-cycle-phase目标易于解释/。我认为这可能会帮助其他人理解。

总之,您不应尝试同时理解这三个部分,首先应该了解这些组中的关系:


生命周期与阶段
插件与目标

1。生命周期与阶段

生命周期是按顺序收集的阶段,请参见此处的生命周期参考。当您调用一个阶段时,它还将调用之前的所有阶段。

例如,清洁生命周期分为三个阶段(预清洁,清洁,后清洁)。

mvn clean


它将被称为预清洁和清洁。

2。插件与目标

目标就像插件中的一个动作。因此,如果plugin是类,目标就是方法。

您可以这样调用目标:

mvn clean:clean


这意味着“调用干净的目标,在clean插件中”(这里与clean阶段无关。不要让“ clean”一词使您感到困惑,它们不一样!)

3。现在,阶段与目标之间的关系:

阶段可以(预)链接到目标。例如,通常,干净阶段链接到干净目标。因此,当您调用以下命令时:

mvn clean


它将调用预清洁阶段和链接到clean:clean目标的clean阶段。

与以下内容几乎相同:

mvn pre-clean clean:clean


更多详细信息和完整示例位于https://www.surasint.com/maven-life-cycle和目标易于解释/

#7 楼

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

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

示例:-如果运行mvn clean

此阶段将执行目标mvn clean:clean

目标:Maven目标受阶段限制

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

评论


它不一定必须“与2个或3个目标相关联”。也可以是一个,也可以是三个以上。

– Gerald Broser
2015年6月20日在13:29



#8 楼

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


默认
清洁
站点

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

生命周期清理-> [pre -clean,clean,post-clean]

生命周期站点-> [pre-site,site,post-site,site-deploy]

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

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