Maven插件开发引导--第一个maven插件项目
前言
因为最近觉得mybatis自动生成代码的功能很有用且有趣,就打算研究一下maven插件。本文的主要目的是使用命令行和使用idea引导建立第一个简单的”hello,world” maven插件,部分参考了官方的文档。个人感觉官方文档内容设计不是特别好,有兴趣有能力的同学可以自己看。
重要官方提示:插件命名规范和Apache Maven商标
你最好命名你的插件为<yourplugin>-maven-plugin。
强烈不建议你命名插件为maven-<yourplugin>-plugin(maven放在开头),因为这个命名模式是为Apache Maven团队的groupId为org.apache.maven.plugins的插件项目保留的。使用这个命名模式侵犯了Apache Maven的商标。
你的第一个插件
在这个部分,我们将会创建一个简单的插件,这个插件不需要任何参数而且运行时只在屏幕上显示一条信息。这样,我们能够展示创建一个插件项目的基本要点、最简单的Java mojo的内容定义,以及几种运行mojo的方法。
命令行创建
先展示整个项目的目录结构。
你的第一个mojo
简单来说,一个java mojo就是一个简单的能够实现一个插件的目标的java类。尽管一个插件中,几个相似的mojo也可能会有一个父类来实现共同的代码,但是不需要像EJBs一样需要很多的类。
当遍历源码目录获取mojo类时,插件工具会寻找带有Java 5 @Mojo 注解或者 "goal"javadoc注解的类。带有这个注解的类都会被被包含在插件的配置文件中。
A Simple mojo
下面是一个简单的没有参数的mojo的例子。
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." );
}
}
- 除了excute方法,类org.apache.maven.plugin.AbstractMojo提供了实现一个mojo的所有基础要素。
- 需要注解@Mojo
- excute方法可以抛出两种异常:
- org.apache.maven.plugin.MojoExecutionException:如果出现任何未知的错误,抛出这个异常将会显示一个“BUILD ERROR”信息。
- org.apache.maven.plugin.MojoFailureException:如果产生发生了已知的问题,抛出这个异常将会显示一个“BUILD FAILURE”信息。
- getLog方法(在AbstractMojo中定义)返回一个类似log4j的logger对象,这个对象允许插件创建“debug”、”info“、“warn”、”error”标签的日志。这个logger对象可以作为一个给用户打印日志的一个方式。
pom配置:
mojo类完成了之后,为了正确的完成构建,项目需要合理地设置一些配置。
groupId | 插件的groupId,最好匹配这个MOJO包的通用的前缀 |
---|---|
artifactId | 插件名 |
version | 插件版本 |
packaging | 应该设置为“maven-plugin” |
dependencies | 对于Maven Plugin Tools API,需要引入的依赖,这样项目才能去解析"AbstractMojo" 和相关的其他类。 |
下面是对上面表格中描述的参数在一个简单的mojo项目的pom中如何设置的举例说明:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<name>Sample Parameter-less Maven Plugin</name>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</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-plugin中,有几个和标准构建流程相关的插件功能。
compile | 编译插件的java代码 |
---|---|
process-classes | 获取数据构建关键字 |
test | 运行插件单元测试 |
package | 构建插件jar包 |
install | 在本地仓库中部署插件jar包 |
deploy | 在远程仓库部署插件jar包 |
在项目根目录下执行 mvn install,就能编译部署插件jar包到本地仓库。
也可以使用模板构建一个maven插件项目,直接执行命令:
mvn archetype:generate -DgroupId=sample.plugin -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin
一路回车确定,就会在当前目录生成一个模板插件项目。
执行你的第一个Mojo
执行你的新插件最直接的方式是在命令行中。首先在你的项目中的pom.xml中添加下面的语句,引入这个插件。
···
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>
···
然后需要在项目根目录下以下面的完整格式:
mvn groupId:artifactId:version:goal
执行插件。例如上面的例子就是"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi"。如果你是要测试这个插件是否成功,也可以直接在插件项目的根目录执行"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi",运行结果如下:
还可以将插件和具体的构建生命周期绑定起来,需要在pom中修改build配置。
···
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>sayhi</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
···
这样配置的话,当项目在编译的过程中你的插件也会被执行。具体信息可以参考后续的文章(如果有,我会在这里补充出来O. O)。
idea创建
生成插件项目
idea创建一个插件模板项目就比较简单了,以下是贴图流程。
- 首先创建一个maven mojo的插件项目
- 设置项目
- 一路点击下一步,然后生成plugin项目
自动生成的代码已经包括了Mojo类,可以修改excute方法的内容,输出“hello world"。
引用插件
在pom.xml中引入插件配置后,可以在idea的maven构建窗口看到:
双击运行可以看到日志输出: