Maven是一个一个优秀的项目管理开源框架,其插件机制为其功能扩展提供了非常大的便捷性。大多数情况下,我们不需要自己开发Maven插件,因为Maven本身提供了很多便捷的官方插件。但是对于某些特殊场景和特殊需求,开发一个自定义的Maven插件能大大提高开发效率。本文以一个简单的例子,展示如何创建一个自定义的Maven插件。
Maven插件开发
本文会以一个自制的Maven插件为例,展示如何使用Idea从0开始构建自制的Maven插件。
Maven插件目标
Maven本质是一个插件执行框架,所有的工作都是通过插件完成的。包括常见的命令如install/clean/deploy/compiler这些命令,其实底层都是一个一个的Maven插件的执行结果。
插件目标:开发一个自制的Maven插件,插件名称叫demo-test-maven-plugin
,该插件包含两个Goal:
- goal1:执行命令
mvn demo-test:goal1
,控制台输出This is goal1.
; - goal2:执行命令
mvn demo-test:goal2
,向控制台输出This is goal2.
;
插件项目命名
在开发Maven插件之前,第一件事是确定插件项目名称。Maven插件有特定的命名规范,命名规范分为两种类型:
- 官方插件项目命名规范:
maven-xxx-plugin
,其中插件名为xxx
,在Maven中可以使用命令mvn xxx
调用插件; - 自定义插件项目命名规范:
xxx-maven-plugin
,其中插件名为xxx
,在Maven中可以使用命令mvn xxx
调用插件;
我们的插件是自定义插件,插件名为demo-test
,所以插件的项目名称为demo-test-maven-plugin
。
建立插件项目
确定好建立的项目名称为demo-test-maven-plug
之后,我们就可以去实际创建一个项目。本节以Idea作为工具,介绍如何建立一个Maven插件项目。
-
Idea中新建Maven项目,并选择
org.apache.maven.archetypes:maven-archetype-mojo
作为项目模板; -
Idea中输入项目名称,点击确认;
-
最后一步,点击
Finish
按钮,完成项目的创建;
通过以上步骤,我们创建了一个空的Maven插件项目,这个项目目前没有任何代码。
插件项目分析
通过上述步骤,我们创建好了一个空的Maven项目,项目的目录如下所示:
![创建项目4]
自动生成的项目POM文件内容如下所示,其中有以下几点比较关键:
packaging
:普通Java项目的packaging是jar/war/pom,但是Maven插件项目的packaging是maven-plugin;maven-plugin-api
:Maven插件项目依赖了maven-plugin-api
包,这是Maven插件项目必须依赖的核心包;
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.demo.test</groupId>
<artifactId>demo-test-maven-plug</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
<name>demo-test-maven-plug Maven Mojo</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
自动生成的项目中还包含一个Java文件,内容如下所示,这个Java文件有几个特点:
- 生成的类继承了
AbstractMojo
,这里是Maven插件的规范要求,Maven插件必须要继承AbstractMojo
并抽象的execute
方法; - 类与方法上有一些
Tag
,如@goal
。Tag
和注解不同,Tag
会出现在相关文档中; Tag
@goal
的作用是指定插件的命名,如命令mvn clean
中,clean
就是@goal;Tag
@phase
的作用是绑定插件执行的生成周期,如clean
周期,那么在执行mvn clean
时会自动触发插件;Tag
@parameter
用来指定插件的参数。
Tag机制有很多问题,如没有语法报错等,Maven为什么会使用Tag而不是注解呢呢?这是因为Java早期不支持注解,JDK1.5才开始添加注解功能。Maven开发之初没有注解,所以只能使用Tag来代替,新版本的Maven中已经可以使用注解来代替Tag。