maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。
这是maven系列第10篇。
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动运行打包好的构件。各种好玩的东西只要你能想到,都可以通过maven插件去完成,不过我们需要先了解如何自定义maven插件。
必备知识
本篇环境
jdk1.8
maven3.6.2
idea
本章内容
自定义插件详细步骤
自定义插件参数的使用
自定义插件前缀的使用
手动实现打包之后自动运行的插件
自定义插件详细步骤
maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:
org.apache.maven.plugin.Mojo
接口有3个方法:
-
void execute() throws 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
,如下图:
选择Maven
,如下图:
点击上图中的Next
,如下图,输入项目坐标信息:
点击上图中的Next
,如下图,输入Project name
为maven-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 name
为demo1-maven-plugin
,如下图:
点击上图的Finish
,如下图:
点击上图中的OK
按钮,完成创建工作,目前项目结构如下图:
设置demo1-maven-plugin/pom.xml中packaging的值为maven-plugin,如下
<packaging>maven-plugin</packaging>
demo1-maven-plugin/pom.xml引入插件需要的依赖
-
<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>
最后demo1-maven-plugin/pom.xml
内容如下
-
<?xml version=
"1.0" encoding=
"UTF-8"?>
-
<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/xsd/maven-4.0.0.xsd">
-
<modelVersion>
4.0
.0</modelVersion>
-
<groupId>com.javacode2018</groupId>
-
<artifactId>demo1-maven-plugin</artifactId>
-
<version>
1.0-SNAPSHOT</version>
-
<!-- 插件必须为maven-plugin这个类型 -->
-
<packaging>maven-plugin</packaging>
-
<properties>
-
<project.build.sourceEncoding>UTF
-8</project.build.sourceEncoding>
-
<!-- 配置maven编译的时候采用的编译器版本 -->
-
<maven.compiler.compilerVersion>
1.8</maven.compiler.compilerVersion>
-
<!-- 指定源代码是什么版本的,如果源码和这个版本不符将报错,maven中执行编译的时候会用到这个配置,默认是
1.5,这个相当于javac命令后面的-source参数 -->
-
<maven.compiler.source>
1.8</maven.compiler.source>
-
<!-- 该命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容,maven中执行编译的时候会用到这个配置,默认是
1.5,这个相当于javac命令后面的-target参数 -->
-
<maven.compiler.target>
1.8</maven.compiler.target>
-
</properties>
-
<dependencies>
-
<!-- maven插件依赖 start -->
-
<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>
-
<!-- maven插件依赖 end -->
-
</dependencies>
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-plugin-plugin</artifactId>
-
<version>
3.4</version>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
创建目标类
在demo-maven-plugin
中创建的目标类com.javacode2018.Demo1Mojo
,需要继承org.apache.maven.plugin.AbstractMojo
,需要实现@Mojo注解
,如下:
-
package com.javacode2018;
-
import org.apache.maven.plugin.AbstractMojo;
-
import org.apache.maven.plugin.MojoExecutionException;
-
import org.apache.maven.plugin.MojoFailureException;
-
import org.apache.maven.plugins.annotations.Mojo;
-
/**
-
* 工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:路人甲Java
-
*/
-
@Mojo(name =
"demo1")
-
public class Demo1Mojo extends AbstractMojo {
-
public void execute() throws MojoExecutionException, MojoFailureException {
-
}
-
}
注意上面注解@Mojo(name = "demo1")
,name
使用来标注目标的名称为demo1
。
实现目标类的execute方法
我们在execute
方法中输出一句话
this.getLog().info("hello my first maven plugin!");
目前execute方法代码如下:
-
public void execute() throws MojoExecutionException, MojoFailureException {
-
this.getLog().info(
"hello my first maven plugin!");
-
}
安装插件到本地仓库
在maven-chat10/pom.xml
目录执行下面命令:
mvn clean install -pl :demo1-maven-plugin
注意上面命令和在
demo1-maven-plugin/pom
中执行mvn clean install
效果是一样的,只是这个地方使用了maven裁剪的功能,对这块命令不熟悉的可以看:Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!
上面命令效果如下:
-
D:\code\IdeaProjects\maven-chat10>mvn clean install -pl :demo1-maven-plugin
-
[INFO] Scanning
for projects...
-
[INFO]
-
[INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------
-
[INFO] Building demo1-maven-plugin
1.0-SNAPSHOT
-
[INFO] ----------------------------[ maven-plugin ]----------------------------
-
[INFO]
-
[INFO] --- maven-clean-plugin:
2.5:clean (
default-clean) @ demo1-maven-plugin ---
-
[INFO] Deleting D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target
-
[INFO]
-
[INFO] --- maven-resources-plugin:
2.6:resources (
default-resources) @ demo1-maven-plugin ---
-
[INFO] Using
'UTF-8' encoding to
copy filtered resources.
-
[INFO] Copying
0 resource
-
[INFO]
-
[INFO] --- maven-compiler-plugin:
3.1:compile (
default-compile) @ demo1-maven-plugin ---
-
[INFO] Changes detected - recompiling the module!
-
[INFO] Compiling
1 source file to D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\classes
-
[INFO]
-
[INFO] --- maven-plugin-plugin:
3.4:descriptor (
default-descriptor) @ demo1-maven-plugin ---
-
[INFO] Using
'UTF-8' encoding to read mojo metadata.
-
[INFO] Mojo extractor with id: java-javadoc found
0 mojo descriptors.
-