插件(plugin)
Maven的核心是一个插件执行框架;所有的工作都是由插件完成的。
Maven中Plugin分为两种类型:
-
build类型Plugin只能在build阶段执行,在POM中需要在
<build/>
标签下进行配置。 -
reporting类型:在site generation阶段被执行。在POM中需要在
<reporting/>
标签下配置。
核心plugin如下图所示:

我们通常在pom.xml中配置plugin,如下图所示:

我们可以通过下面的命令来查看failsafe插件的使用方法
mvn failsafe:help
我们可以通过下面的命令来运行failsafe插件
mvn <PLUGIN>:<GOAL>
想要了解更多的plugin信息可以参考文章:
在使用插件的过程中,我们还必须指定要作为运行构建的一部分------目标(goal)。
目标(goal)
插件(plugin)可以具有一个或多个目标(goal),其中每个目标表示该插件的能力。goal 是存在于 maven plugin 中,因此,大多数的 maven 功能实际上是存在于插件中,一个 maven 插件提供了一组可以被运行的 goal。大家可可以理解为goal就是插件的参数,同一个插件通过不同的参数输入来实现不同功能的输出。例如:Compiler插件(其完整的插件名字为org.apache.maven.plugins:maven-compiler-plugin)有两个目标:compile和testCompile。前者编译主代码的源代码,而后者编译测试代码的源代码。
mvn可以执行一个目标或一个阶段(甚至多个目标或多个阶段),如下所示:
mvn clean install plugin:goal
某些阶段(phase)默认具有与之绑定的目标(goal),例如clean和 site。对于默认的生命周期,这些绑定依赖于打包值。如果大家对Maven中阶段和生命周期相关概念不是很熟悉可以参考文章:
不理解Maven中生命周期和阶段的含义,是无法理解mvn clean install这条命令的!-CSDN博客
下面是一些目标与其所在对应构建阶段的绑定关系。
clean phase

site phase

Default Lifecycle Bindings - Packaging pom

Default Lifecycle Bindings - Packaging ejb
/ ejb3
/ jar
/ par
/ rar
/ war

Default Lifecycle Bindings - Packaging ear

Default Lifecycle Bindings - Packaging maven-plugin

关于目标(goal)的总结
目标(goal)是真正执行任务的单元;
目标的提供者是插件(plugin),每一个plugin可能提供多个目标;
可以将对应的goal绑定到某个phase上,当在进行maven构建的过程中只要执行到了对应的phase上,就可以在当前phase上完成goal的执行。
阶段和目标的关系总结
大家看到这里可能会有个问题?goal跟phase很像,二者有什么区别呢?运行某个 phase 时,必须把生命周期中的所有的前置 phase 都会运行一遍。而运行 goal,可以脱离生命周期这个概念,通过 maven 插件,单独的运行某个 goal 或一组 goal。例如指定了jar:jar目标,它只会运行jar:jar目标来将你的代码打包到一个jar中。如果您之前没有运行编译目标或以其他方式准备编译代码,则很可能会失败。
另外,如果我们尝试构建一个Maven项目,如果没有指定阶段或目标就会报错:
No goals have been specified for this build. You must specify a valid lifecycle phase or a goal
在IDEA中,我们可以清晰地看到我们Maven工程中生命周期、插件和目标的相关详情信息,如下所示:

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!