Maven-插件使用与配置

2,690 阅读3分钟

什么是插件

插件可以理解为一组任务的集合,用户可以通过命令行直接运行指定插件的任务,也可以将插件任务挂载到构建生命周期,随着生命周期运行。

Maven插件分类

  • Build Plugin
  • Reporting Plugin

插件前缀

Maven对于插件artifactId的命名有以下规范

  • 官方:maven-${prefix}-plugin
  • 第三方:${prefix}-maven-plugin

如果插件命名符合上面这两个规范,在使用到插件的地方,可以使用prefix直接引用,Maven会自动关联上。

比如
mvn maven-compiler-plugin:compile
可以缩写为
mvn compiler:compile

如果用户想自定义插件前缀,可以在pom.xml中声明goalPrefix,如下

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          ...
          <goalPrefix>somePrefix</goalPrefix>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

这样的话,下面三个命令的效果是等效的

mvn maven-plugin-plugin:goal
mvn plugin:goal
mvn somePrefix:goal

如何使用插件

要使用插件,首先得知道插件有哪些可执行任务,每个插件都会包含help任务,输出插件的任务简介文档。

//以compiler为例
mvn compiler:help

...

This plugin has 3 goals:

compiler:compile
  Compiles application sources

compiler:help
  Display help information on maven-compiler-plugin.
  Call mvn compiler:help -Ddetail=true -Dgoal=<goal-name> to display parameter
  details.

compiler:testCompile
  Compiles application test sources.

如果想了解某个任务的使用详情,承上例子如下

mvn compiler:help -Ddetail -Dgoal=compile

直接运行

完整的命令行格式如下

mvn groupId:artifactId:version:goal

以compiler插件为例,坐标信息如下

    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugins</artifactId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.9.0</version>

执行compile任务,完整的格式如下

mvn org.apache.maven.plugins:maven-compiler-plugin:3.9.0:compile

如果pom.xml在声明compiler插件时指定了groupId和version,那么命令可以缩写为

mvn maven-compiler-plugin:compile

如果未声明,groupId会从settings.xmlpluginGroups获取。

再根据插件前缀约定,我们可以直接使用compiler引用maven-compiler-plugin,所以命令可以进一步简写

mvn compiler:compile

挂载到构建周期阶段运行

接着上面的例子,修改pom.xml,将compile任务挂载到编译阶段compile

...
  <execution>
    <goal>compile</goal>
    <phase>compile</phase>
  </execution>
...

那么命令可以简写为

mvn compile

插件配置

通用配置

每个插件任务对应插件项目中的一个MoJO类,这个类中属性就是任务的配置,下面为一个例子

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中的属性名称一一对应。

<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>

使用@parameter可以指定默认值,也可以将任务配置与系统属性相绑定,如time属性,非必传,默认值为50,可以通过系统属性query.url配置,如下

mvn myquery:query -Dquery.url=http://maven.apache.org

不同类型的参数映射

  1. 简单对象
...
    @Parameter(property = "myString")
    private String myString;
...
...
<configuration>
  <myString>a string</myString>
</configuration>
...
  1. 复杂对象

...
    @Parameter(property = "person")
    private Person person;
...
...
<configuration>
  <person>
    <firstName>Jason</firstName>
    <lastName>van Zyl</lastName>
  </person>
</configuration>
...
  1. List
...
    @Parameter(property = "animals")
    private List animals;
...

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myanimal-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <animals>
            <animal>cat</animal>
            <animal>dog</animal>
            <animal>aardvark</animal>
          </animals>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>
  1. Map
...
    @Parameter(property = "myMap")
    private Map myMap;
...

...
  <configuration>
    <myMap>
      <key1>value1</key1>
      <key2>value2</key2>
    </myMap>
  </configuration>
...

  1. Properties
...
    @Parameter(property = "myPro")
    private Properties myPro;
...
...
  <configuration>
    <myProperties>
      <property>
        <name>propertyName1</name>
        <value>propertyValue1</value>
      </property>
      <property>
        <name>propertyName2</name>
        <value>propertyValue2</value>
      </property>
    </myProperties>
  </configuration>
...
  1. 数组
@Parameter
private String[] myArray;

<myArray>
  <param>value1</param>
  <param>value2</param>
</myArray>

一个完整的插件配置

/**
 * @goal query
 * @phase package
 */
public class MyBoundQueryMojo
    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
    {
        ...
    }
}
...

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>execution1</id>
            <phase>install</phase>
            <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>

使用dependencies

插件也会依赖其他构件,通过dependencies可以控制依赖的版本,同时也可以排除不必要的依赖。

<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>

使用inherited

默认情况下,插件配置会被继承,如果子pom不想继承父pom的插件配置,可以设置 inherited = false

<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>