6

ApacheMaven插件开发

 3 years ago
source link: https://tianmingxing.com/2020/02/19/ApacheMaven%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Apache Maven本身实际上只是一个插件驱动引擎。换句话说,真正干活的是插件,例如:创建jar文件,创建war文件,编译代码,单元测试代码,创建项目文档等。

插件命名规则

  • 应用使用<yourplugin>-maven-plugin这种方式。
  • 不要使用maven-<yourplugin>-plugin这种命名方式,因为它是由Apache Maven团队维护官方Apache Maven插件的保留命名模式。官方有明确指出使用这种命名模式是对Apache Maven商标的侵犯。

写第一个插件

我们将构建一个简单的插件,其目标是不带任何参数,并且在运行时仅在屏幕上显示一条消息。

1.在IDE中创建maven项目

项目POM文件内容如下,注意packaging属性与普通应用的区分:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.tianmingxing</groupId>
<artifactId>helloworld-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>

<name>这是我的第一个maven插件</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>

</project>

2.开发Mojo类

package com.tianmingxing.mavenplugin.helloworld;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;

/**
* 这是我的第一个maven插件,它只是简单的输出一句话。
*
* @author tianmingxing <[email protected]>
* @date 2020-02-29
*/
@Mojo(name = "sayhi")
public class GreetingMojo extends AbstractMojo {

@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello, world.");
}
}
  • 继承org.apache.maven.plugin.AbstractMojo模板类获取实现Mojo的通用方法。
  • 注解@Mojo是必须的,它可以控制执行mojo的方式和时间。
  • getlog()方法返回类似于log4j的记录器对象,该对象允许插件在“debug”,“info”,“warn”和“error”级别创建消息。该记录器是向用户显示信息的公共方法。

3.构建插件并安装到本地仓库

执行命令mvn clean install,然后在本地仓库中可以看到。

4.在项目中使用

创建一个简单的maven项目,在项目POM文件中配置如下:

<build>
<plugins>
<plugin>
<groupId>com.tianmingxing</groupId>
<artifactId>helloworld-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>

你可以在命令行用以下几种方式运行插件:

  1. mvn com.tianmingxing:helloworld-maven-plugin:1.0.0-SNAPSHOT:sayhi
  2. mvn com.tianmingxing:helloworld-maven-plugin:sayhi
  3. mvn helloworld:sayhi,使用本方法的前提是必须按照上面指定的命名方式。
  4. 当然你也可以直接在IDE中通过maven的工具来点击执行。

你应该可以获得和我同样的输出:

[INFO] --- helloworld-maven-plugin:1.0.0-SNAPSHOT:sayhi (default-cli) @ my-app ---
[INFO] Hello, world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

你也可以把插件与某个生命周期绑定在一起,比如你希望在编译(compile)阶段自动触发执行这个插件,那么可以向下面这样配置:

<plugin>
<groupId>com.tianmingxing</groupId>
<artifactId>helloworld-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>sayhi</goal>
</goals>
</execution>
</executions>
</plugin>

继续沿用上面的示例,在GreetingMojo类中添加变量greeting。

/**
* 显示问候语
*/
@Parameter(property = "sayhi.greeting", defaultValue = "Hello World!")
private String greeting;

有两种方式给greeting变量赋值,一是在项目POM文件中配置:

<plugin>
<groupId>com.tianmingxing</groupId>
<artifactId>helloworld-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<configuration>
<greeting>Welcome</greeting>
</configuration>
</plugin>

二是在命令行执行插件时添加-D选项的方式:mvn helloworld:sayhi -Dsayhi.greeting=haha

注意:POM配置优先于命令行选项,如果这两者没有配置,则使用默认配置(即defaultValue值)。

  • 布尔型:如果值为true表示真,反之都为假。
    @Parameter
    private boolean myBoolean;
    <myBoolean>true</myBoolean>
  • 整数:包括byte,Byte,int,Integer,long,Long,short和Short。
    @Parameter
    private Integer myInteger;
    <myInteger>10</myInteger>
  • 浮点:包括double,Double,float和Float。
    @Parameter
    private Double myDouble;
    <myDouble>1.0</myDouble>
  • 日期
    @Parameter
    private Date myDate;
    <myDate>2005-10-06 2:22:55.1 PM</myDate>
  • 文件或目录
    @Parameter
    private File myFile;
    <myFile>c:\temp</myFile>
  • 网址
    @Parameter
    private URL myURL;
    <myURL>http://maven.apache.org</myURL>
  • 纯文本:包括char,Character,StringBuffer和String。读取配置时,XML文件中的文本用作要分配给参数的值。对于char和Character参数,仅使用文本的第一个字符。
  • 枚举
    public enum Color {
    GREEN,
    RED,
    BLUE
    }

    @Parameter
    private Color myColor;
    <myColor>GREEN</myColor>
    还可以将枚举类型中的元素用作defaultValues,如下所示:
    /**
    * My Enum
    */
    @Parameter(defaultValue = "GREEN")
    private Color myColor;
  • 数组:通过多次指定参数来配置数组类型参数。
    @Parameter
    private String[] myArray;
    <myArray>
    <param>value1</param>
    <param>value2</param>
    </myArray>
  • 集合:包括java.util.Collection的实现类,例如ArrayList或HashSet。通过像数组一样多次指定参数来配置这些参数。
    @Parameter
    private List myList;
    <myList>
    <param>value1</param>
    <param>value2</param>
    </myList>
  • KV映射:包括java.util.Map的实现类,例如HashMap。
    @Parameter
    private Map myMap;
    <myMap>
    <key1>value1</key1>
    <key2>value2</key2>
    </myMap>
  • 属性:即java.util.Properties类型
    @Parameter
    private Properties myProperties;
    <myProperties>
    <property>
    <name>propertyName1</name>
    <value>propertyValue1</value>
    <property>
    <property>
    <name>propertyName2</name>
    <value>propertyValue2</value>
    <property>
    </myProperties>
  • 其它对象类
    /**
    * My Object.
    */
    @Parameter
    private MyObject myObject;
    <myObject>
    <myField>test</myField>
    </myObject>
    如果这个对象和插件Mojo对象不在同一个包,则需要指定对象的全限定名:
    <myObject implementation="com.tianmingxing.mavenplugin.mojo.MyObject">
    <myField>test</myField>
    </myObject>

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK