第10篇:自定义插件,maven的生命交给你来设计!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。
这是maven系列第10篇。
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动自动运行打包好的构件。各种好玩的东西只要你能想到,都可以通过maven插件去完成,不过我们需要先了解如何自定义maven插件。
必备知识
- Maven系列第6篇:生命周期和插件详解,高手必备!
本篇环境
-
jdk1.8
-
maven3.6.2
-
idea
本章内容
-
自定义插件详细步骤
-
自定义插件参数的使用
-
自定义插件前缀的使用
-
手动实现打包之后自动运行的插件
自定义插件详细步骤
maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:
org.apache.maven.plugin.Mojo
接口有3个方法:
void execute() MojoExecutionException, MojoFailureException;
void setLog( Log log );
Log getLog();
-
execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法。
-
setLog:注入一个标准的Maven日志记录器,允许这个Mojo向用户传递事件和反馈
-
getLog:获取注入的日志记录器
说一下上面这个Log,这是一日志接口,里面定义了很多方法,主要用户向交互者输出日志,比如我们运行mvn clean
,会输出很多提示信息,这些输出的信息就是通过Log来输出的。
Mojo接口有个默认的抽象类:
org.apache.maven.plugin.AbstractMojo
这个类中把Mojo
接口中的setLog
和getLog
实现了,而execute
方法没有实现,交给继承者去实现,这个类中Log默认可以向控制台输出日志信息,maven中自带的插件都继承这个类,一般情况下我们开发插件目标可以直接继承这个类,然后实现execute
方法就可以了。
实现一个插件的具体步骤
1、 创建一个maven构件,这个构件的packaging
比较特殊,必须为maven-plugin
,表示这个构件是一个插件类型,如下:
pom.xml中的packageing元素必须如下值:
<packaging>maven-plugin</packaging>
2、导入maven插件依赖:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
3、创建一个目标类,需要继承org.apache.maven.plugin.AbstractMojo
4、目标类中添加注解@Mojo注解:
@org.apache.maven.plugins.annotations.Mojo(name="目标名称")
注意@Mojo
注解用来标注这个类是一个目标类,maven对插件进行构建的时候会根据这个注解来找到这个插件的目标,这个注解中还有其他参数,后面在详细介绍。
5、在目标类的execute
方法中实现具体的逻辑
6、安装插件到本地仓库:插件的pom.xml所在目录执行下面命令
mvn clean install
或者可以部署到私服仓库,部署方式和其他构件的方式一样,这个具体去看前面文章的私服的文章。
7、让使用者去使用插件
案例1
下面我们来实现我们第一个插件,插件构件信息:
<groupId>com.javacode2018</groupId>
<artifactId>demo1-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
创建一个目标类demo1,调用这个目标的时候,希望他能够输出:
hello my first maven plugin!
创建一个maven项目
打开idea,点击File->New->Project
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7QGWVgu-1629908740221)(media/40b81c016bc4695b99669f13d4af01fc.png)]
选择Maven
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpWEPsmt-1629908740225)(media/29baa68faa1523b9e69503e0d4215eaa.png)]
点击上图中的Next
,如下图,输入项目坐标信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfb9FhRG-1629908740229)(media/225faaebb3a428977aa17855f14fe700.png)]
点击上图中的Next
,如下图,输入Project name
为maven-chat10
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rwq9IZ8l-1629908740233)(media/6c8782fcc498d677fc7b9abfd95f95b6.png)]
点击上图中的Finish
,完成创建,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWmbgDMQ-1629908740236)(media/ad5ab3b6a563560a390f7d13a0c5701d.png)]
配置一下idea的maven环境,点击File->Settings
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JycBnj6d-1629908740240)(media/31e6ec12f10e0a9ca95e121685f815ae.png)]
删除下面2个无用的文件夹:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RALiKTwP-1629908740245)(media/68c1daa77d794421891803b7f6d1fc30.png)]
创建插件模块demo1-maven-plugin
这次用idea创建一个插件模块demo1-maven-plugin
,具体过程如下。
在刚才的maven-chat10
项目窗口中,点击File->Project Structure
,如下图:
也可以使用快捷键
Ctrl+Alt+Shift+S
打开
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPebFzeb-1629908740249)(media/b7e6a8a3a532b21d3b1cb6856b94edd3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcB9ZJuO-1629908740253)(media/e43fc5acb27a2e9bb8cd266ea932f278.png)]
选择上图找你的Modules
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECEuxh1M-1629908740255)(media/3ce9a3acab62ae38614b19baeadadec5.png)]
点击+
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXVb49zy-1629908740257)(media/a0c7b7e5e99236811db416695282bb32.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63PKsU2y-1629908740259)(media/2f70ab7d2efa05b81336a598b8ae4b51.png)]
选择上图中的New Module
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quJJ27Gh-1629908740261)(media/c8b78f9c86e120b9721e2dcba3fa7606.png)]
选择上图左侧的Maven
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeWuodqE-1629908740262)(media/b2e32be73edd42d4f5dee01a33106027.png)]
点击上图中的Next
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Risad6pj-1629908740264)(media/41d93688bbdd89f5442c1a371f7e576a.png)]
将Add as module to
设置为maven-chat10
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuth0uAC-1629908740266)(media/fc26e489460f14ff620e5e870a3073e8.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kprvWmuW-1629908740267)(media/9dbcf35404f710a23c7cc117ff28f504.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiLpxwOm-1629908740269)(media/2311f90a15ae166c019a05fb72ed84f6.png)]
上图中输入坐标信息,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrSaXjh1-1629908740270)(media/879707742287a5d4dfa8c72d25356073.png)]
点击上图中的Next
,默认如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgg6t8bL-1629908740272)(media/eb247b603eee61f8595d53770405c01f.png)]
修改上图中Module name
为demo1-maven-plugin
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQYFhk4B-1629908740273)(media/9232592562dfd46319347e713a1e5ea0.png)]
点击上图的Finish
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZmWOh5aY-1629908740274)(media/777d3f4b80daea8a8093d213e9b69056.png)]
点击上图中的OK
按钮,完成创建工作,目前项目