插件开发
创建工程设定打包方式
<packaging>maven-plugin</packaging>
引入依赖
下面两种方式二选一:
将来在文档注释中使用注解
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
将来直接使用注解
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
</dependency>
创建 Mojo 类
Mojo 类是一个 Maven 插件的核心类。
Mojo 这个单词的意思是:Maven Old Java Object,其实 mojo 这个单词本身包含魔力;符咒(袋);护身符;(人的)魅力的含义,Maven 用 Mojo 是因为它是对 POJO 开的一个小玩笑。
AbstractMojo 抽象类
我们实现 Mojo 接口比较困难,幸好可以继承 AbstractMojo,此时我们只要实现 execute() 这一个方法即可。
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> This is my first maven plugin. <---");
}
}
插件配置
文档注释中用注解
对应的 pom.xml 中的依赖: maven-plugin-api
/**
* goal 指定调用本类execute()方法的目标
* @goal sayHello
*/
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> first blood <---");
}
}
直接在类上标记注解
对应 pom.xml 中的依赖:maven-plugin-annotations
// name 属性:指定调用本类execute()方法的目标
@Mojo(name = "sayHello")
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> first blood <---");
}
}
安装插件
要在后续使用插件,就必须至少将插件安装到本地仓库。
注册插件
我们需要将插件坐标中的 groupId 部分注册到 settings.xml 中。
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>com.wuxian.maven</pluginGroup>
</pluginGroups>
使用插件
识别插件前缀
Maven 根据插件的 artifactId 来识别插件前缀。例如下面两种情况:
]前置匹配
匹配规则:${prefix}-maven-plugin
artifactId:hello-maven-plugin
前缀:hello
中间匹配
匹配规则:maven-${prefix}-plugin
artifactId:maven-hello-plugin
前缀:hello
在命令行直接用
命令:
mvn hello:sayHello
效果:
配置到 build 标签里
这里找一个和插件无关的 Maven 工程配置才有说服力。
配置
<build>
<plugins>
<plugin>
<groupId>com.atguigu.maven</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<id>hello</id>
<!-- 指定和目标关联的生命周期阶段 -->
<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>
效果
命令行使用
执行已和插件目标绑定的生命周期: