作者:悠悠做神仙

之前做了一款Maven插件,主要是用来扫描项目的代码调用链,并根据需求生成脑图,以及做一些关于项目信息的维护。因为是扫描代码工程,所以采取插件的方式是最合适的。

趁热,给大家分享一波关于Maven插件开发的内容。

本次分享主要分为两部分,首先是本篇的Maven基础篇,主要是基本概念、生命周期、插件目标、常用插件和命令等,虽然大家常用Maven插件,但是对于其中的一些原理,可能大家不是很清楚,同时这些基础,也是做Maven插件开发之前需要了解的。了解完基础后,我们便开始上手进行Maven插件的开发,另外一篇会手把手教大家开发一个简单的Maven插件。

基础篇分享内容的导航:

1、Maven基本概念

2、Maven生命周期

3、Maven生命周期与插件目标

4、Maven相关命令

5、Maven常用插件

【Java工具开发】Maven插件开发之基础篇(一)_java

1、Maven基本概念


Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。---来自【百度百科】


官网 ​​ 概念:


Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型(POM) 的概念,Maven 可以从一条中央信息中管理项目的构建、报告和文档。


【Java工具开发】Maven插件开发之基础篇(一)_java_02

还记得以前,在没有Maven之前,用eclipse工具进行开发的时候,最痛苦的莫过于关于依赖包的处理,由于缺包、包版本不一致、包冲突等问题引起的,需要一系列导包操作,真是苦不堪言:kelian:,需要先下载依赖包,再手动导入,既没效率也容易引发其他问题。后来,Maven出来了,在配置好Maven的环境变量后,大家通过维护项目的pom.xml文件,就可以实现对于项目相关依赖的导入及导出操作,简单快捷!

2、Maven生命周期

关于Maven生命周期,主要是存在三个标准的周期:

​clean​ ​​、​ ​default​ ​​、​ ​site​ ​​,分别用于清理项目、构建项目、生成项目站点,而在一个生命周期中通常又会包含若干个阶段( ​ ​phase ​ ​)。

以下是一张典型的Maven构建(​ ​build​ ​)生命周期的图:

【Java工具开发】Maven插件开发之基础篇(一)_apache_03

为了完成一个default生命周期,这些阶段(包括未在上面罗列的阶段)会被按顺序执行。

所以,就像图中compile是一个阶段,test也是一个阶段,把这些阶段按照一定顺序组合起来,就是生命周期的概念。

执行顺序

Maven通过将插件的目标与阶段进行绑定,可能一个目标绑定多个阶段或者不绑定。

那么,没有绑定到阶段的目标,可以单独调用触发。这些目标的执行顺序取决于调用目标和构建阶段的顺序。

​clean ​ ​​和 pakage 是构建阶段,​ ​dependency:copy-dependencies​ ​ 是目标。

命令:​ ​mvn clean dependency:copy-dependencies package​

这里的 ​ ​clean ​ ​​阶段将会被首先执行,然后 ​ ​ dependency:copy-dependencies​ ​​ 目标会被执行,最终 ​ ​package ​ ​阶段被执行。

如果在调用生命周期的时候,想看到每个阶段的情况,可以参考附件【打印default生命周期配置】、【打印clean生命周期配置】,加到pom文件,调用一下命令查看一下即可。

3、Maven生命周期与插件目标

不过,生命周期只是一个抽象概念,一个生命周期按照顺序分为很多阶段(​ ​phase ​ ​​),而每个阶段(​ ​phase ​ ​​)到底做什么,则是通过绑定不同的插件(​ ​goal​ ​)目标实现。

构建阶段( phase )由插件目标( goal ​​ )构成!

所以,真正在干活的其实是插件,调用插件不同的目标(​ ​goal​ ​)去实现不同的需求。

如图所示:

一个插件可以有很多的目标(​ ​goal​ ​​),每个阶段通过绑定插件的不同(​ ​goal​ ​​),来实现每个阶段(​ ​phase​ ​)要做的事情。

【Java工具开发】Maven插件开发之基础篇(一)_插件开发_04

就拿打包来看,如图所示,我们可以看到对应的阶段所绑定的插件目标。

【Java工具开发】Maven插件开发之基础篇(一)_java_05

4、Maven相关命令

关于插件命令格式

阶段:​ ​mvn 阶段名​

例如:​ ​mvn clean​ ​​ ,​ ​mvn install​

目标:​ ​mvn 插件名:目标名 ​

例如:​ ​mvn dependency:tree​

如图,idea截图的部分maven指令提示。

【Java工具开发】Maven插件开发之基础篇(一)_maven_06

当然,有些插件是有默认 ​ ​goal​ ​​,也就是说,​ ​mvn 插件名​ ​​,会执行默认 ​ ​goal​ ​。

命令参数

-D 传入属性参数

-P 使用pom中指定的配置

-e 显示maven运行出错的信息

-o 离线执行命令,即不去远程仓库更新包

-X 显示maven允许的debug信息

-U 强制去远程参考更新snapshot包

5、Maven常用插件

Maven官方插件列表:

​http​ ​​ ​://​ ​​ ​maven.apache.org/plugins/index.html​

【Java工具开发】Maven插件开发之基础篇(一)_maven_07

  • maven-compiler-plugin :编译插件
  • maven-jar-plugin :打成jar包插件
  • maven-source-plugin :打包源码插件
  • maven-resource-plugin : 处理项目的资源文件拷贝到输出目录
  • maven-dependency-plugin :处理项目的依赖文件
  • maven-antrun-plugin :可以在maven中运行ant任务
  • duplicates-finder-plugin :查找重复依赖
  • mail-maven-plugin :设置邮件发送

关于Maven的基础就分享到这里,想必大家对Maven又有了一些深入的了解,下面我们将进行实战,开发一款Maven插件!​ ​【Java工具开发】Maven插件开发之实战篇(二)​

【Java工具开发】Maven插件开发之基础篇(一)_apache_08