Maven插件开发
Maven 作为一个优秀的项目管理工具,其插件机制提供了很多功能扩展。Maven 自带的插件足够满足我们的项目开发要求,不排除在某些特殊情况下,需要我们自己开发一个自己的插件来协助我们完成某些工作。Maven 官方例程提供了详细的解答,本文内容来源于官方例程。
Maven插件命名规范
Maven 命名有要求,插件命名为 <myplugin>-maven-plugin ,而不推荐使用 maven-<myplugin>-plugin,因为后者是 Maven 团队维护官方插件的保留命名方式。
MOJO是什么
MOJO 就是 Maven Ordinary Java Object。每一个 MOJO 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 MOJO做统一分发。一个 MOJO 包含一个简单的 Java 类。插件中多个类似 MOJO 的通用之处可以使用抽象父类来封装。
创建MOJO工程
创建 Maven 插件工程与正常工程相似,但是,记得要选用 maven-archetype-mojo 模板。
提醒:新建 Maven 项目时,需要选择 archetype。那么,什么是archetype? archetype 的意思就是模板原型的意思,原型是一个 Maven 项目模板工具包。一个原型被定义为从其中相同类型的所有其它事情是由一个原始图案或模型。原型将帮助作者为用户创建 Maven 项目模板,并为用户提供了手段,产生的这些项目模板参数化的版本。maven-archetype-mojo 是一个 Maven 的 Java 插件开发项目原型。
创建完成之后,首先我们来看 pom.xml 文件:
<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>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
<name>hello-maven-plugin Maven Mojo</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- dependencies to annotations -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
maven 插件工程 packaging 方式为 maven-plugin,并且自动导入了 maven-plugin-api 依赖。
创建 MOJO 类
在上述创建的工程项目里面添加GreetingMojo类。
package sample.plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
/**
* Says "Hi" to the user.
*
*/
@Mojo( name = "sayhi")
public class GreetingMojo extends AbstractMojo
{
public void execute() throws MojoExecutionException
{
getLog().info( "Hello, world." );
}
}
解释一下这个类,我们发现它继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。
怎么让 Maven 知道这是一个 Mojo 而不是一个普通的 Java 类呢?这里就需要说一下 Mojo 的查找机制了,在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解的类来当作一个 Mojo 类。在上面的例子中,我们使用了 @MoJo 的方法来声明一个 Mojo。
插件运行
首先将编写的插件打包上传到仓库,然后在其他项目的 pom.xml 文件中引入插件
<build>
<plugins>
...
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>
执行命令
mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi
即可看到输出结果
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ maven-springmvc-mysql ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar (0 B at 0 B/s)
[INFO] Hello, world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.052 s
[INFO] Finished at: 2019-06-16T16:29:27+08:00
[INFO] ------------------------------------------------------------------------
其他
既然是执行函数,没有参数是不完美的。Maven 插件支持在xml文件里面传入参数的形式。另外,还可以将插件的运行附加到构建生命周期中的某个特定阶段。如下所示:
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<greeting>Welcome</greeting> //传入greeting参数valu为Welcome
</configuration>
<executions>
<execution>
<phase>compile</phase> //编译器执行插件
<goals>
<goal>sayhi</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Maven官方文档
关于 Maven 插件开发的更多内容,请参考官方文档:
http://maven.apache.org/plugin-developers/index.html