今天我们来聊聊Maven中两个高级的概念—— 插件和目标

插件(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信息可以参考文章:

Maven -- Available Plugins

在使用插件的过程中,我们还必须指定要作为运行构建的一部分------目标(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工程中生命周期、插件和目标的相关详情信息,如下所示:

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

相关推荐
开开心心就好5 小时前
高效全能PDF工具,支持OCR识别
java·前端·python·pdf·ocr·maven·jetty
shane-u1 天前
Maven私服搭建与登录全攻略
java·maven
半部论语1 天前
jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路
java·开发语言·maven·intellij-idea
我喜欢山,也喜欢海1 天前
Jenkins Maven 带权限 搭建方案2025
java·jenkins·maven
kaikaile19951 天前
Jenkins集成Maven
servlet·jenkins·maven
.生产的驴1 天前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
.生产的驴1 天前
Maven 公司内部私服中央仓库搭建 局域网仓库 资源共享 依赖包构建共享
java·maven
Brilliant Nemo2 天前
五、框架实战:SSM整合原理和实战
maven·mybatis
亮1112 天前
GITLAB跑gradle项目 不借助maven-publish直接上传到nexus私人仓库
java·gitlab·gradle·maven
极小狐2 天前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven