这里记录下如何编写一个简单的插件。
插件需要建立一个Mojo工程,idea里有对应的工程类型。
插件命名最好为xxx-maven-plugin,因为如果是这样的命名,使用插件时可以只用xxx。不要使用maven-xxx-plugin,因为这是官方插件命名方式。
pom文件:
1. packaging需要定义为maven-plugin
2.需要引入相关api的jar包。
<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>com.liyao</groupId>
<artifactId>xtgyr-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
<name>test-maven-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</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这里编写两个目标,一个带参数,一个不带。
@Mojo(name = "print")
public class MyMojo extends AbstractMojo
{
public void execute()
throws MojoExecutionException
{
getLog().info("hello ");
}
}
所有插件目标都要对应一个AbstractMojo实现类,并且使用@Mojo注解(并不是唯一注解)。这个插件定义了一个print目标,最终会打印hello。
@Mojo(name = "printWithP")
public class MyMojo2 extends AbstractMojo
{
@Parameter( property = "greeting.name", defaultValue = "Tom" )
private String name;
public void execute()
throws MojoExecutionException
{
getLog().info("hello " + name);
}
}
第二个插件加了一个参数name,注意这里的property是给命令行方式用的,实例变量名是给pom配置execution方式用的。可以指定默认值。
安装插件
maven为插件项目默认提供了compile,test,package,install,deploy五个目标。
本地的话只要mvn install就好。
使用
在另一个项目的pom中配置插件,最简单的就是:
<plugin>
<groupId>com.liyao</groupId>
<artifactId>xtgyr-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
这种方式需要我们手动运行插件。
mvn groupid:artifactid:version:goal。如果符合之前的命名规范,可以mvn prefix:goal。
这里mvn xtgyr:print即可。
如果传参,可以mvn xtgyr:printWithP -Dgreeting.name=ly
如果我们想在pom里绑定插件,需要加配置,比如:
<plugin>
<groupId>com.liyao</groupId>
<artifactId>xtgyr-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<id>123</id>
<phase>compile</phase>
<goals>
<goal>printWithP</goal>
</goals>
<configuration>
<name>ff</name>
</configuration>
</execution>
<execution>
<id>456</id>
<phase>compile</phase>
<goals>
<goal>print</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
绑定在了compile周期,直接mvn compile即可。同时分别配置了两个goal。
这里顺便记录下插件的配置。
参数:一般情况,通用的不变的参数放在pom文件中定义。对于可变的可选的使用命令行方式,比方说test插件的skip。
目标:一个插件的不同目标通常需要配置多个execution项目。每一个都定义自己的id,phase和goal。如果参数也不同,就把configuration配置在execution内部,如果是插件级别共享,就放在plugin下,每一个execution都共享。
优先级:只要是通过mvn xxx:goal方式运行,就只看命令行传入的参数,即使pom配置了也不用;如果是按照绑定生命周期的方式,pom文件配置的参数优先级更高,只有pom没有配置,才会用命令行的。
参考: