官方文档:https://maven.apache.org/guides/plugin/guide-java-plugin-development.html
命名规范
<yourplugin>-maven-plugin
创建项目
生成项目
方式一、IDEA 2023
方式二、命令行
mvn archetype:generate -DgroupId=cn.lsj -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo
项目结构
不管使用哪种方式,都差不多,项目结构如下:
修改依赖的版本
原本的maven-plugin-api
模板可能不是最新的,建议升级到较新的版本。
<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>cn.lsj</groupId><artifactId>hello-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.8.7</version></dependency><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.4</version><scope>provided</scope></dependency></dependencies></project>
修改Mojo文件
默认生成的MyMojo.java
文件无法直接跑起来,先改为如下:
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;/*** Goal which touches a timestamp file.** @goal touch* @phase process-sources*/
@Mojo(name = "hello") // 插件的全局名称
public class MyMojo extends AbstractMojo {/*** Location of the file.** @parameter expression="${project.build.directory}"* @required*/private File outputDirectory;public void execute() throws MojoExecutionException {getLog().info("插件生效");
// File f = outputDirectory;
//
// if (!f.exists()) {
// f.mkdirs();
// }
//
// File touch = new File(f, "touch.txt");
//
// FileWriter w = null;
// try {
// w = new FileWriter(touch);
//
// w.write("touch.txt");
// } catch (IOException e) {
// throw new MojoExecutionException("Error creating file " + touch, e);
// } finally {
// if (w != null) {
// try {
// w.close();
// } catch (IOException e) {
// // ignore
// }
// }
// }}
}
测试运行
进入pom.xml
所在的目录,执行命令。
// 格式: mvn groupId:artifactId:version:goalName
mvn cn.lsj:hello-maven-plugin:1.0-SNAPSHOT:hello -X
安装到本地仓库
进入pom.xml
所在的目录,执行命令:mvn install
。将插件安装到本地仓库。
使用插件
本地项目通过下面配置可以引入刚才安装的插件。在编译的时候,插件生效。
<build><plugins><plugin><groupId>cn.lsj</groupId><artifactId>hello-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><executions><execution><!-- 指定phase为compile值,表示在编译阶段插件生效。 --><phase>compile</phase><goals><!-- 插件全局名称 --><goal>hello</goal></goals></execution></executions></plugin></plugins>
</build>
[INFO] xxxxxxxxxxxxxxxxx
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:hello (default) @ docking-client ---
[INFO] 插件生效
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.749 s
[INFO] Finished at: 2023-01-08T15:13:10+08:00
[INFO] ------------------------------------------------------------------------