maven插件开发

开发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;
 
/**
 * Says "Hi" to the user.
 *
 */
@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>
  <!-- This should be set to "maven-plugin"-->
  <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>
 
    <!-- dependencies to annotations -->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

使用插件

  1. 在项目中引入插件
...
  <build>
    <plugins>
      <plugin>
        <groupId>sample.plugin</groupId>
        <artifactId>hello-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
      </plugin>
    </plugins>
  </build>
...
  1. 执行插件
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值。以下是一些目标到构建阶段的绑定。在这里插入图片描述
在这里插入图片描述

插件参数

  • 在Mojo中定义参数
    /**
     * The greeting to display.
     */
     //property属性值允许命令行执行插件时,可以通过-Dsayhi.greeting=***设置参数值。
    @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,具体参考链接

插件配置

/**
 * @goal query  //目标名称是query
 * @phase package //默认绑定阶段是package
 *
 */
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>
          <!-- 这个没有指定绑定的phase,如果插件也没有默认绑定的phase,则execution2不执行 -->
            <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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值