总述 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集成插件手动点击)。