Zexin Li

Please keep honest, open, patient, happy and visionary.

0%

如何编写maven插件(重新发布)

总述

maven作为热门的build system经常被各种Java project采用。有时我们会遇到需要编写自定义maven插件的需求。

以IDEA为例:首先选择从maven创建一个project,如果勾选create from achetype就会生成模板程序代码(这里以maven-achetype-mojo为例)。项目名称规范是${NAME}-maven-plugin,然后需要选择maven home directory,随后自动生成模板程序代码。

对maven源的配置

值得一提的是,初次使用maven会自动下载大量依赖文件,就算有梯子,也可能非常慢。这时就需要在创建project之前先对${maven_path}/conf/settings.xml进行设置更换国内源。

1
2
3
4
5
6
7
8
9
10
// 对源的配置:增加localRepository,配置mirror url
<localRepository>${YOUR_MAVEN_REPO_PATH}</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

正式开始写maven project的代码

对模板程序pom.xml的修改

可以看出来maven模板程序的pom.xml配置已经非常老了(比如这个maven-plugin-api还是2.0),这里参考KIWI的一篇博客一通乱改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>${YOUR_GROUP_ID}</groupId>
<artifactId>${NAME}-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
<name>${NAME}-mavne-plugin Maven Mojo</name>
<url>http://maven.apache.org</url>
<dependencies>
<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>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5.2</version>
</plugin>
</plugins>
</build>
</project>

Mojo类的规则简要介绍

Mojo类必须继承AbstractMojo 并实现他的 execute 方法,而 execute 方法其实就是这个插件的入口类。简单介绍注解@Mojo(name = $NAME),用于定义插件相关信息,以便于在pom.xml里通过$NAME的形式显示指定。@Execute()注解则能指定Mojo的执行时机,绑定phase或lifecycle等。

部署

写完了代码,需要mvn clean install(把该插件打包并部署至本地仓库),其他本地maven项目就可以通过pom.xml使用该插件。想要他人也可以使用,需要使用mvn deploy命令。

1
2
3
4
5
6
7
8
9
<build>
<plugins>
<plugin>
<groupId>${YOUR_GROUP_ID}</groupId>
<artifactId>${NAME}-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>

增加依赖后,可以直接命令行mvn ${NAME}:${GOAL} [args]的方式调用;也绑定至lifecycle,通过mvn test等命令调用(也可以IDEA右上角maven集成插件手动点击)。

Welcome to my other publishing channels