Maven 生命周期、自定义插件、生命周期默认绑定的插件


生命周期


Maven 定义了三个类别的生命周期:

  1. 清理工作的生命周期:Clean
  2. 构建和部署工作的生命周期:Default
  3. 创建站点工作的生命周期:Site

Maven 的每个生命周期内部,又细分成多个执行阶段

每个生命周期间是独立的,但是同一生命周期内的阶段是有顺序的,当一个阶段执行时,在它前面的所有同一生命周期的阶段都会被执行,比如我们执行 mvn post-clean 那么 pre-cleanclean 两个阶段也会被自动执行

Maven 只是定义了这些执行阶段,并没有对其具体实现,所有的实现都是由插件来提供,Maven 只是起到了调用作用,和一点点的规范作用,为啥说只是一点点呢,比如 Maven 定义 clean 阶段的本意是想让插件实现时做清理操作,但是插件实现时偏偏在 clean 阶段做了打包处理,那也没有办法

Clean 生命周期内部阶段,按阶段顺序列举

阶段名称Maven 建议插件实现该阶段时的处理
pre-clean清理前的处理
clean真正的清理处理
post-clean清理后的处理

Default 生命周期内部阶段,只列举核心阶段,按阶段顺序列举

阶段名称Maven 建议插件实现该阶段时的处理
validate校验项目的正确性
compile编译项目中 src=>mainsrc=>test 目录下的源代码
test-compile编译项目中 src=>test 目录下的源代码
test执行 test-compile 编译后的二进制文件
package生成目标包,jar war 等
install将生成的包安装到本地仓库
deploy将生成的包安装到远程仓库

Site 生命周期内部阶段,按阶段顺序列举

阶段名称Maven 建议插件实现该阶段时的处理
pre-site生成站点文档前的处理
site真正生成站点文档的处理
post-site生成站点文档后的处理
site-deploy将站点文档部署到服务器的处理

执行 Maven 生命周期的命令

执行 Maven 生命周期的命令格式是:mvn 阶段名,比如:mvn clean,就会执行与 clean 阶段 绑定的插件功能(同一阶段可以绑定多个插件,运行时都会被执行),注意:生命周期命令必须在有 pom.xml 的路径下运行

自定义 Maven 插件


先看一下执行插件的命令 mvn 插件名:目标名

插件名和目标名

插件名:

插件名与我们自定义插件工程的 <artifactId> 息息相关,所以 <artifactId> 不能乱起,需要满足规则:

  • ${name}-maven-plugin
  • maven-${name}-plugin

<artifactId> 必须满足上面两个规则中的一个,而 ${name} 部分就会自动变成我们的插件名,
比如 artifactId 是 ares5k-maven-plugin,那么我们的插件名就是 ares5k


目标名:

每个自定义插件中,可以定义多个功能,每个功能需要用目标名来标识,后面用命令调用插件的时候,需要指定目标名来明确具体调用插件中的哪一个功能,大概原理如下图:

插件调用命令关系图

自定义插件示例

在一个 <artifactId> 符合规范的 Maven 工程的基础上,实现自定义 Maven 插件,大概需要五个步骤:

  1. 设置打包类型
  2. 引入依赖
  3. 实现功能
  4. 部署插件
  5. 绑定生命周期

1. 设置打包类型

pom.xml 中设置当前 Maven 工程的打包类型

  <!-- 设置打包类型为 maven=plugin -->
  <packaging>maven-plugin</packaging>

2. 引入依赖

pom.xml 中引入两个必要依赖

  <dependencies>
    <!-- 通过继承该模块中的 AbstractMojo 类,来实现自定义插件目标功能-->
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.5.4</version>
    </dependency>
    <!-- 通过该模块中的 @Mojo 注解,绑定自定义插件功能的目标名   -->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.5.2</version>
    </dependency>
  </dependencies>

3. 实现功能

新建 Java 类,并继承 AbstractMojo 抽象类来实现自定义插件的功能,然后通过 @Mojo 注解给功能绑定一个目标名,后面要通过目标名来调用该功能(如果插件有多个功能,那么就创建多个 Java 类,并分别设置目标名)

package com.ares5k;

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

/**
 * 自定义插件功能
 *
 * @author ares5k
 */
@Mojo(name = "print") // 绑定该功能的目标名
public class Hello extends AbstractMojo {

    /**
     * 实现自定义插件功能
     */
    @Override
    public void execute() {
        System.out.println("ares5k's plugin is running!");
    }
}

5. 部署插件

插件功能写好后,要将插件安装和注册

(1)安装插件,使用 Maven 生命周期命令 mvn install 将工程安装到本地仓库或使用生命周期命令 mvn deploy 将项目部署到远程仓库,二者都可以,视情况而定,生命周期命令需要在有 pom.xml 的路径下运行

(2)在 Maven 安装目录/conf/settings.xml 中,添加下面代码注册插件:

  <pluginGroups>
    <!-- 这里写自定义 Maven 插件工程的 groupId -->
	<pluginGroup>com.ares5k</pluginGroup>
  </pluginGroups>

这个地方使用了 Maven 生命周期构建命令 mvn installmvn deploy,我们并没有对 installdeploy 阶段绑定插件,至于为何这两个阶段可以执行,是因为 Maven 对一些核心阶段绑定了默认插件,这个在下一部分会有说明

这个时候我们的自定义插件就可以使用了, 我们可以通过执行插件的命令实验一下,示例中的插件名是 ares5k,定义了一个功能,其目标名是 print,所以执行插件的命令为 mvn ares5k:print

自定义插件执行

5. 绑定生命周期

上一步,我们已经可以执行自定义插件了,但是我们使用的是执行插件的命令 mvn 插件名:目标名,实际使用时,一般习惯将插件和 Maven 的生命周期进行绑定,这样使用生命周期命令 mvn 阶段名 就可以执行插件了,语法更方便一些

想让自定义插件中的目标 print 绑定到 Maven 生命周期的 clean 阶段,就可以在 pom.xml 中添加下面代码:

  <build>
    <plugins>
      <!-- 引入自定义插件 -->
      <plugin>
        <groupId>com.ares5k</groupId>
        <artifactId>ares5k-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <executions>
          <execution>
            <!-- 绑定 Maven 的生命周期阶段 -->
            <phase>clean</phase>
            <goals>
               <!-- 与阶段绑定的目标 -->
              <goal>print</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

使用生命周期命令 mvn clean 测试插件中目标名为 print 的功能是否成功绑定到生命周期的 clean 阶段

测试绑定生命周期

生命周期默认绑定的插件


在前面已经发现了 cleaninstalldeploy 这三个阶段,虽然我们并没有对其绑定插件,但是也能够正确执行,这是因为 Maven 对一些比较核心的生命周期阶段进行了默认的插件绑定,几个常用的如下:

插件名目标名阶段名目标功能
maven-clean-plugincleanclean删除原构建目录 target
maven-resources-pluginresourcesresources将 main/resources 中的文件复制到 target 里
maven-compiler-plugincompilecompile编译 main/java 中的 Java 文件,并将结果放到 target 里
maven-surefire-plugintesttest执行 test/java 中的测试代码,一般搭配 junit
maven-jar-pluginjarpackage将项目打成 jar 包
maven-install-plugininstallinstall将打包后的项目安装到本地仓库
maven-deploy-plugindeploydeploy将打包后的项目发送到到远程仓库
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值