MAVEN专题之十、设计你自己的maven插件【高手必备】

本文详细讲解了如何设计并实现自定义的Maven插件,包括创建maven-plugin构件、设置插件参数、定义插件前缀以及实现打包后自动运行的插件。通过案例展示了从创建目标类到安装插件到本地仓库的完整步骤,帮助开发者掌握自定义Maven插件的开发流程。
摘要由CSDN通过智能技术生成

maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。

这是maven系列第10篇。

整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。

Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动运行打包好的构件。各种好玩的东西只要你能想到,都可以通过maven插件去完成,不过我们需要先了解如何自定义maven插件。

必备知识

  1. Maven系列第6篇:生命周期和插件详解,高手必备!

本篇环境

  1. jdk1.8

  2. maven3.6.2

  3. idea

本章内容

  1. 自定义插件详细步骤

  2. 自定义插件参数的使用

  3. 自定义插件前缀的使用

  4. 手动实现打包之后自动运行的插件

自定义插件详细步骤

maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:

org.apache.maven.plugin.Mojo

接口有3个方法:


       
       
       
  1. void execute() throws MojoExecutionException, MojoFailureException;
  2. void setLog( Log log );
  3. Log getLog();
  • execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法。

  • setLog:注入一个标准的Maven日志记录器,允许这个Mojo向用户传递事件和反馈

  • getLog:获取注入的日志记录器

说一下上面这个Log,这是一日志接口,里面定义了很多方法,主要用户向交互者输出日志,比如我们运行mvn clean,会输出很多提示信息,这些输出的信息就是通过Log来输出的。

Mojo接口有个默认的抽象类:

org.apache.maven.plugin.AbstractMojo

这个类中把Mojo接口中的setLoggetLog实现了,而execute方法没有实现,交给继承者去实现,这个类中Log默认可以向控制台输出日志信息,maven中自带的插件都继承这个类,一般情况下我们开发插件目标可以直接继承这个类,然后实现execute方法就可以了。

实现一个插件的具体步骤
1、 创建一个maven构件,这个构件的packaging比较特殊,必须为maven-plugin,表示这个构件是一个插件类型,如下:

pom.xml中的packageing元素必须如下值:

<packaging>maven-plugin</packaging>
2、导入maven插件依赖:

       
       
       
  1. <dependency>
  2.     <groupId>org.apache.maven</groupId>
  3.     <artifactId>maven-plugin-api</artifactId>
  4.     <version> 3.0</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.apache.maven.plugin-tools</groupId>
  8.     <artifactId>maven-plugin-annotations</artifactId>
  9.     <version> 3.4</version>
  10.     <scope>provided</scope>
  11. </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

下面我们来实现我们第一个插件,插件构件信息:


       
       
       
  1. <groupId>com.javacode2018</groupId>
  2. <artifactId>demo1-maven-plugin</artifactId>
  3. <version> 1.0-SNAPSHOT</version>
  4. <packaging>maven-plugin</packaging>

创建一个目标类demo1,调用这个目标的时候,希望他能够输出:

hello my first maven plugin!
创建一个maven项目

打开idea,点击File->New->Project,如下图:

选择Maven,如下图:

点击上图中的Next,如下图,输入项目坐标信息:

点击上图中的Next,如下图,输入Project namemaven-chat10

点击上图中的Finish,完成创建,如下图:

配置一下idea的maven环境,点击File->Settings,如下图:

删除下面2个无用的文件夹:

创建插件模块`demo1-maven-plugin`

这次用idea创建一个插件模块demo1-maven-plugin,具体过程如下。

在刚才的maven-chat10项目窗口中,点击File->Project Structure,如下图:

也可以使用快捷键Ctrl+Alt+Shift+S打开

选择上图找你的Modules,如下图:

点击+,如下图:

选择上图中的New Module,如下图:

选择上图左侧的Maven,如下图:

点击上图中的Next,如下图:

Add as module to设置为maven-chat10,如下图:

上图中输入坐标信息,如下图:

点击上图中的Next,默认如下图:

修改上图中Module namedemo1-maven-plugin,如下图:

点击上图的Finish,如下图:

点击上图中的OK按钮,完成创建工作,目前项目结构如下图:

设置demo1-maven-plugin/pom.xml中packaging的值为maven-plugin,如下
<packaging>maven-plugin</packaging>
demo1-maven-plugin/pom.xml引入插件需要的依赖

       
       
       
  1. <dependency>
  2.     <groupId>org.apache.maven</groupId>
  3.     <artifactId>maven-plugin-api</artifactId>
  4.     <version> 3.0</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.apache.maven.plugin-tools</groupId>
  8.     <artifactId>maven-plugin-annotations</artifactId>
  9.     <version> 3.4</version>
  10.     <scope>provided</scope>
  11. </dependency>

最后demo1-maven-plugin/pom.xml内容如下


       
       
       
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <project xmlns= "http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion> 4.0 .0</modelVersion>
  6.     <groupId>com.javacode2018</groupId>
  7.     <artifactId>demo1-maven-plugin</artifactId>
  8.     <version> 1.0-SNAPSHOT</version>
  9.     <!-- 插件必须为maven-plugin这个类型 -->
  10.     <packaging>maven-plugin</packaging>
  11.     <properties>
  12.         <project.build.sourceEncoding>UTF -8</project.build.sourceEncoding>
  13.         <!-- 配置maven编译的时候采用的编译器版本 -->
  14.         <maven.compiler.compilerVersion> 1.8</maven.compiler.compilerVersion>
  15.         <!-- 指定源代码是什么版本的,如果源码和这个版本不符将报错,maven中执行编译的时候会用到这个配置,默认是 1.5,这个相当于javac命令后面的-source参数 -->
  16.         <maven.compiler.source> 1.8</maven.compiler.source>
  17.         <!-- 该命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容,maven中执行编译的时候会用到这个配置,默认是 1.5,这个相当于javac命令后面的-target参数 -->
  18.         <maven.compiler.target> 1.8</maven.compiler.target>
  19.     </properties>
  20.     <dependencies>
  21.         <!-- maven插件依赖 start -->
  22.         <dependency>
  23.             <groupId>org.apache.maven</groupId>
  24.             <artifactId>maven-plugin-api</artifactId>
  25.             <version> 3.0</version>
  26.         </dependency>
  27.         <dependency>
  28.             <groupId>org.apache.maven.plugin-tools</groupId>
  29.             <artifactId>maven-plugin-annotations</artifactId>
  30.             <version> 3.4</version>
  31.             <scope>provided</scope>
  32.         </dependency>
  33.         <!-- maven插件依赖 end -->
  34.     </dependencies>
  35.     <build>
  36.         <plugins>
  37.             <plugin>
  38.                 <groupId>org.apache.maven.plugins</groupId>
  39.                 <artifactId>maven-plugin-plugin</artifactId>
  40.                 <version> 3.4</version>
  41.             </plugin>
  42.         </plugins>
  43.     </build>
  44. </project>
创建目标类

demo-maven-plugin中创建的目标类com.javacode2018.Demo1Mojo,需要继承org.apache.maven.plugin.AbstractMojo,需要实现@Mojo注解,如下:


       
       
       
  1. package com.javacode2018;
  2. import org.apache.maven.plugin.AbstractMojo;
  3. import org.apache.maven.plugin.MojoExecutionException;
  4. import org.apache.maven.plugin.MojoFailureException;
  5. import org.apache.maven.plugins.annotations.Mojo;
  6. /**
  7.  * 工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:路人甲Java
  8.  */
  9. @Mojo(name =  "demo1")
  10. public class Demo1Mojo extends AbstractMojo {
  11.     public void execute() throws MojoExecutionException, MojoFailureException {
  12.     }
  13. }

注意上面注解@Mojo(name = "demo1")name使用来标注目标的名称为demo1

实现目标类的execute方法

我们在execute方法中输出一句话

this.getLog().info("hello my first maven plugin!");

目前execute方法代码如下:


       
       
       
  1. public void execute() throws MojoExecutionException, MojoFailureException {
  2.     this.getLog().info( "hello my first maven plugin!");
  3. }
安装插件到本地仓库

maven-chat10/pom.xml目录执行下面命令:

mvn clean install -pl :demo1-maven-plugin

注意上面命令和在demo1-maven-plugin/pom中执行mvn clean install效果是一样的,只是这个地方使用了maven裁剪的功能,对这块命令不熟悉的可以看:Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!

上面命令效果如下:


       
       
       
  1. D:\code\IdeaProjects\maven-chat10>mvn clean install -pl :demo1-maven-plugin
  2. [INFO] Scanning  for projects...
  3. [INFO]
  4. [INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------
  5. [INFO] Building demo1-maven-plugin  1.0-SNAPSHOT
  6. [INFO] ----------------------------[ maven-plugin ]----------------------------
  7. [INFO]
  8. [INFO] --- maven-clean-plugin: 2.5:clean ( default-clean) @ demo1-maven-plugin ---
  9. [INFO] Deleting D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target
  10. [INFO]
  11. [INFO] --- maven-resources-plugin: 2.6:resources ( default-resources) @ demo1-maven-plugin ---
  12. [INFO] Using  'UTF-8' encoding to  copy filtered resources.
  13. [INFO] Copying  0 resource
  14. [INFO]
  15. [INFO] --- maven-compiler-plugin: 3.1:compile ( default-compile) @ demo1-maven-plugin ---
  16. [INFO] Changes detected - recompiling the module!
  17. [INFO] Compiling  1 source file to D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\classes
  18. [INFO]
  19. [INFO] --- maven-plugin-plugin: 3.4:descriptor ( default-descriptor) @ demo1-maven-plugin ---
  20. [INFO] Using  'UTF-8' encoding to read mojo metadata.
  21. [INFO] Mojo extractor with id: java-javadoc found  0 mojo descriptors.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值