文章目录
在实际开发中,几乎没有什么场景需要自己开发自定义
Maven
插件,所以只是通过这个角度帮助自己更好的理解插件的目标和生命周期阶段之间的关系
1. 插件开发步骤
1.1 创建工程
创建一个Maven
工程即可:
-
groupId
:com.scorpios.maven
-
artifactId
:hello-maven-plugin
(名称有规则,看下文)
1.2 指定打包方式
要在pom
文件中指定打包方式为:maven-plugin
maven-plugin
<?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>org.scorpio.maven</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<packaging>maven-plugin</packaging>
</project>
1.3 引入依赖
下面两种方式二选一,都可以实现定制目标方法
1.3.1 在代码中使用注解
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
1.3.2 在类上使用注解
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
</dependency>
1.4 创建 Mojo 类
Mojo
类是一个 Maven
插件的核心类。Mojo
这个单词的意思是:Maven Old Java Object
。
1.4.1 Mojo 接口
每一个 Mojo
都需要实现 org.apache.maven.plugin.Mojo
接口
1.4.2 AbstractMojo 抽象类
实现 Mojo
接口比较困难,可以继承 AbstractMojo
,此时只要实现execute()
这一个方法即可。
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> This is my first maven plugin. <---");
}
}
2. 插件配置
2.1 Mojo 类中配置
在上面引入依赖时有两种选择,所以这地方配置分别对应上述两种选择。
2.1.1 代码中用注解
此种配置方式对应上述 pom.xml
中引入的依赖: maven-plugin-api
//指定调用本类execute()方法的目标
/**
* @goal sayHello
**/
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> This is my first maven plugin. <---");
}
}
此处能不能理解,在配置plugin时指定的goal标签的意思。在goal标签中指定sayHello,则就会执行此处的execute()方法
2.1.2 在类上使用注解
此种配置方式对应上述pom.xml
中引入的依赖: maven-plugin-annotations
// name 属性:指定目标名称
@Mojo(name = "firstBlood")
public class MyPluginOfFistBlood extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> first blood <---");
}
}
此种方式和上面效果一样
2.2 安装插件
若要把该插件提供给其他项目使用,就必须要将插件安装到本地仓库
2.4 注册插件
需要将插件坐标中的 groupId
部分注册到 settings.xml
中
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>com.scorpios.maven</pluginGroup>
</pluginGroups>
3. 使用插件
3.1 识别插件前缀
Maven
根据插件的 artifactId
来识别插件前缀,例如下面两种情况:
- 前置匹配
匹配规则:${prefix}-maven-plugin
artifactId
:hello-maven-plugin
前缀:hello
- 中间匹配
匹配规则:maven-${prefix}-plugin
artifactId
:maven-good-plugin
前缀:good
- 在命令行直接用
命令:mvn hello:sayHello
意思:执行maven
的hello
插件,并执行里面的goal
为sayHello
指定的execute()
方法
效果:
3.2 配置到 build 标签里
这里找一个和插件无关的 Maven
工程配置才有说服力。
3.2.1 配置
<build>
<plugins>
<plugin>
<groupId>com.scorpios.maven</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<id>hello</id>
<!-- 指定和目标关联的生命周期阶段 -->
<!-- 表示在maven的clean阶段会执行goal为sayHello对应的execute()方法-->
<phase>clean</phase>
<goals>
<goal>sayHello</goal>
</goals>
</execution>
<execution>
<id>blood</id>
<phase>validate</phase>
<goals>
<goal>firstBlood</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.2.2 使用
3.2.3 命令行使用
执行已和插件目标绑定的生命周期: