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

xhv8bpkk  于 2022-12-03  发布在  Maven
关注(0)|答案(9)|浏览(159)

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

polhcujo

polhcujo1#

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

cedebl8k

cedebl8k2#

生命周期是一系列命名的阶段
各环节按顺序执行,执行一个环节即执行前面的所有环节。
插件是一个目标的集合,也称为MOJO(MavenOldJavaObject)。
类比:插件是一个类,目标是类中的方法。
Maven基于构建生命周期的中心概念。在每个 * 构建生命周期 * 中有构建阶段,在每个 * 构建阶段 * 中有构建目标
我们可以执行建置阶段或建置目的。当执行建置阶段时,我们会执行该建置阶段内的所有建置目的。建置目的会指派给一或多个建置阶段。我们也可以直接执行建置目的。
有三个主要的内置构建生命周期
1.默认值
1.清洁器
1.地点
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 }

对于上述命令,从第一个阶段开始,依次执行所有阶段,直到“install”阶段。mvn可以执行一个目标或一个阶段(甚至多个目标或多个阶段),如下所示:

mvn clean install plugin:goal

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

构建阶段由Plugin目标组成

Maven的大部分功能都在插件中。插件提供了一组目标,可以使用以下语法执行这些目标:

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

例如,可以通过运行mvn compiler:compile,使用编译器插件的compile-goal编译Java项目。
构建生命周期是一个命名阶段的列表,可用于为目标执行给予顺序。

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

mvn test

执行上述命令时,Maven将运行与每个阶段相关的所有目标,直到test阶段(包括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阶段(及其默认生命周期的所有先前构建阶段)。
此外,如果一个目标绑定到一个或多个构建阶段,则该目标将在所有这些阶段中被调用。
此外,建置阶段也可以有零个或多个系结的目的。如果建置阶段没有系结的目的,该建置阶段将不会执行。但是,如果建置阶段有一个或多个系结的目的,则会执行所有这些目的。

内置生命周期绑定

默认情况下,某些阶段具有绑定到它们的目标。对于默认生命周期,这些绑定取决于打包值。
Maven架构:

参考文献1
参比品2
Maven生命周期Map的Eclipse示例

ulmd4ohb

ulmd4ohb3#

选择的答案是伟大的,但我仍然想添加一些小的主题。一个插图。
它清楚地展示了不同的阶段如何绑定到不同的插件以及这些插件所公开的目标。
因此,让我们来看看运行mvn compile这样的代码的情况:

  • 这是一个阶段,执行编译器插件,目标为编译**
  • 编译器插件有不同的目标。对于mvn compile,它被Map到一个特定的目标,即编译目标。
  • 这与运行mvn compiler:compile相同

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

链接到reference

a6b3iqyw

a6b3iqyw4#

这些定义在Maven site's page Introduction to the Build Lifecycle中有详细说明,但我尝试过summarize
Maven定义了构建过程的4个项目:
1.生命周期
三个内置生命周期(也称为 * 构建生命周期 *):defaultcleansite(生命周期参考)
1.阶段
每个生命周期由 * 阶段 * 组成,例如default生命周期:第一个是第四个,第五个是第六个,第七个是第七个,等等。
1.插件
提供一个或多个目标的工件。
根据打包类型(jarwar等),插件的目标默认绑定到阶段。(内置生命周期绑定)
1.目的
执行的任务(操作)。插件可以有一个或多个目标。
在POM中配置插件时需要指定一个或多个目标。此外,如果插件没有定义默认阶段,则可以将指定的目标绑定到阶段。
可以使用以下命令调用Maven:
1.相位(例如cleanpackage

  1. <plugin-prefix>:<goal>(例如dependency:copy-dependencies
  2. <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
lrl1mhuk

lrl1mhuk5#

我相信已经提供了一个很好的答案,但我想添加一个简单易懂的图表,说明3个不同的生命周期(buildcleansite)以及每个生命周期的阶段。

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

lskq00tm

lskq00tm6#

感谢桑迪普·金达尔和普雷姆拉杰。他们的解释帮助我在对此感到困惑一段时间后理解了。
我在这里创建了一些完整的代码示例和一些简单的解释https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我想它可能会帮助其他人理解。
总之从链接,你不应该试图了解所有三个在一次,首先你应该了解的关系,在这些组:

  • 生命周期与阶段
  • 插件与目标
    1.生命周期与阶段
    生命周期是按顺序排列的阶段的集合,请参阅此处的生命周期引用。当您调用阶段时,它也将调用它之前的所有阶段

例如,清理生命周期有3个阶段(清理前、清理、清理后)。

mvn clean

它将调用预清理清理

2.插件与目标
Goal就像Plugin中的一个动作。所以如果plugin是一个类,goal就是一个方法。

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

mvn clean:clean

这意味着“调用clean插件中的clean目标”(这里没有任何与clean阶段相关的内容。不要让“clean”这个词混淆了你,它们是不一样的!)

3.现在阶段和目标之间的关系:
Phase可以(预先)链接到Goal。例如,通常情况下,clean phase链接到clean goal。因此,当您调用此命令时:

mvn clean

它将调用预清理阶段和链接到clean:clean目标的清理阶段。
它几乎是一样的:

mvn pre-clean clean:clean

更多详细信息和完整示例参见https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

yhived7q

yhived7q7#

具有阶段和目标的Maven工作术语。
阶段:Maven阶段是一组与2或3个目标相关的行动
示例:-如果运行mvn clean
此阶段将执行目标mvn clean:clean
目标:与阶段绑定的Maven目标
用于参考http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

gblwokeq

gblwokeq8#

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

  • 默认值
  • 清洁器
  • 地点
    生命周期默认值-〉[验证,初始化,生成源,处理源,生成资源,处理资源,编译,处理类,生成测试源,处理测试源,生成测试资源,处理测试资源,测试编译,处理测试类,测试,准备包,包,集成测试前,集成测试,集成测试后,验证,安装,部署]
    生命周期清洁-〉[清洁前、清洁、清洁后]
    生命周期站点-〉[站点前、站点、站点后、站点部署]

流程是连续的,例如,对于 default 生命周期,它从 validate 开始,然后是 initialize,依此类推...
您可以通过启用mvn的调试模式(即mvn -X <your_goal>)来检查生命周期

cunj1qz1

cunj1qz19#

参考佩斯的answer
如果您在执行Maven时指定了一个目标,那么它将只运行该目标。换句话说,如果您指定了jar:jar目标,它将只运行jar:jar目标来将您的代码打包到jar中。
此语句有一个例外。Maven Plugin 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中定义的目标run

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>,它执行测试编译和所有前面的阶段。

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

此外,由于default bindings用于“jar”打包,因此很少执行其他目标。

[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] ------------------------------------------------------------------------

因为测试编译或任何先前阶段与此打包类型没有默认绑定。

相关问题