开发maven插件
什么是maven
Maven实际上只是一个 Maven 插件集合的核心框架。换句话说,插件是执行大部分实际操作的地方,插件用于:创建 jar 文件、创建 war 文件、编译代码、单元测试代码、创建项目文档等等。几乎所有你能想到的对项目执行的操作都被实现为 Maven 插件。
插件行为可以通过一组独特的参数来定制,这些参数由每个插件目标(或 Mojo)的描述公开。
什么事Mojo
Mojo(Maven-old-Java-object) 实际上只是 Maven 中的一个目标,插件由任意数量的目标 (Mojos) 组成。Mojos 可以定义为带注释的 Java 类或 Beanshell 脚本。Mojo 指定有关目标的元数据:目标名称、它适合的生命周期的哪个阶段以及它所期望的参数。
创建插件项目
mvn archetype:generate \
-DgroupId=sample.plugin \
-DartifactId=hello-maven-plugin \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-plugin
自定义插件名称规范
自定义插件名称规则: -maven-plugin
第一个Mojo
mojo
package sample.plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
@Mojo( name = "sayhi")
public class GreetingMojo extends AbstractMojo
{
public void execute() throws MojoExecutionException
{
getLog().info( "Hello, world." );
}
}
插件构建配置
packaging是maven-plugin时,绑定的目标如下图所示:
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-classes>
org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor
</process-classes>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-jar-plugin:2.4:jar,
org.apache.maven.plugins:maven-plugin-plugin:3.2:addPluginArtifactMetadata
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
每种packaging绑定的目标配置
构建插件项目时,Maven Plugin Plugin插件会为源码所有的Mojo类生成一个描述文件。
<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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
使用插件
- 在项目中引入插件
...
<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
简化执行
- 如果要执行本地仓库中最新jar包的插件,则可以省略版本
mvn sample.plugin:hello-maven-plugin:sayhi
- 如果插件命名符合${prefix}-maven-plugin规范,则可以按以下格式执行
mvn sample.plugin:hello:sayhi
- 把插件的groupId添加到默认搜索的group配置文件中, 配置文件在${user.home}/.m2/settings.xml
<pluginGroups>
<pluginGroup>sample.plugin</pluginGroup>
</pluginGroups>
此时,可以按以下格式执行
mvn hello:sayhi
绑定Mojo到Build Lifecycle
按下面配置,执行compile阶段的时候,会执行sayhi目标。
<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>
Build Lifecycle
maven有三种内置的构建周期, default, clean and site。生命周期链接 默认情况下,某些阶段具有绑定到它们的目标。而对于default构建周期,这些绑定取决于packaing值。以下是一些目标到构建阶段的绑定。
插件参数
@Parameter( property = "sayhi.greeting", defaultValue = "Hello World!" )
private String greeting;
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<greeting>Welcome</greeting>
</configuration>
</plugin>
参数类型
参数类型基本都支持,基本类型,集合,File, Properties,具体参考链接
插件配置
public class MyQueryMojo
extends AbstractMojo
{
@Parameter(property = "query.url", required = true)
private String url;
@Parameter(property = "timeout", required = false, defaultValue = "50")
private int timeout;
@Parameter(property = "options")
private String[] options;
public void execute()
throws MojoExecutionException
{
...
}
}
标签
配置参数值,子标签名和Mojo中的属性名称或者Setter匹配
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<configuration>
<url>http://www.foobar.com/query</url>
<timeout>10</timeout>
<options>
<option>one</option>
<option>two</option>
<option>three</option>
</options>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
通过系统参数赋值
mvn myquery:query -Dquery.url=http://maven.apache.org
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>execution1</id>
<phase>test</phase>
<configuration>
<url>http://www.foo.com/query</url>
<timeout>10</timeout>
<options>
<option>one</option>
<option>two</option>
<option>three</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
<execution>
<id>execution2</id>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>four</option>
<option>five</option>
<option>six</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
如果插件使用的依赖太旧了, 可以通过此标签指定最新的依赖,会覆盖插件的依赖。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
默认情况下,插件的配置会传递给子pom,可以使用此配置阻断。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
<inherited>false</inherited>
...
</plugin>
</plugins>
</build>
...
</project>
查看插件的参数
大部分插件都支持help目标,输出插件支持的参数,如查看javadoc插件的javadoc目标的参数,执行下面的命令
mvn javadoc:help -Ddetail -Dgoal=javadoc
通过命令行执行指定execution
mvn myqyeryplugin:queryMojo@execution1
|