• 自己动手编写Maven的插件


    Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。本文参考官方文档后使用archetype创建,手动创建太麻烦。

    1. 创建创建项目
      选择maven-archetype-mojo

      创建的项目结构如下

      这里要理解一个术语:mojo,就是Maven Plain Old Java Object,也就是一个普通的Java类,我们写的插件主要是实现AbstractMojo,而AbstractMojo只有一个
      public void execute()
      我的pom.xml
      <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/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.oseye</groupId>
        <artifactId>MvnPluginDemo</artifactId>
        <packaging>maven-plugin</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>MvnPluginDemo Maven Mojo</name>
        <url>http://maven.apache.org</url>
        <dependencies>
          <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>2.0</version>
          </dependency>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
          </dependency>
        </dependencies>
      </project>
    2. 实现execute
      我们修改MyMojo.java的代码,来做一个非常简单的插件:
      package net.oseye;
      
      import org.apache.maven.plugin.AbstractMojo;
      import org.apache.maven.plugin.MojoExecutionException;
      /**
       * @goal oseye
       */
      public class MyMojo extends AbstractMojo{
          public void execute()throws MojoExecutionException
          {
          	getLog().info("这是一个测试插件,goal是oseye");
          }
      }
      • getLog()获取的是AbstractMojo内部的log,类型是:org.apache.maven.plugin.logging.Log;至少在Mojo的开发中,不要使用其他的Log基础设施;
      • @goal标注,goal是maven里定义任务的最小单元,它可以单独,也可以挂在phase上,一个phase可以挂多个goal;这里是单独的;
      • 更多标注信息请参考官方文档
    3. 部署&执行
      部署插件到本地仓库
      mvn install
      要执行,首先需要在pom.xml或setting.xml中配置
        <build>
          <plugins>
            <plugin>
              <groupId>net.oseye</groupId>
              <artifactId>MvnPluginDemo</artifactId>
              <version>0.0.1-SNAPSHOT</version>
            </plugin>
          </plugins>
        </build>
      插件执行的命令格式
      mvn groupId:artifactId:version:goal
      如果是单个的goal可以省略version,执行
      mvn net.oseye:MvnPluginDemo:oseye
      可以看到输出中有

      [INFO] 这是一个测试插件,goal是oseye

    4. 使用简单命令执行
      如果你的artifacitId符合格式 ${prefix}-maven-plugin 或 maven-${prefix}-plugin,可以在你的settings.xml配置文件中加上
      <pluginGroups>
        <pluginGroup>net.oseye</pluginGroup>
      </pluginGroups>
      现在可以这样执行
      mvn MvnPluginDemo:oseye
      而我的Demo没有按照上述格式配置,更多格式信息请参考官方
    5. @execute
      这个标注是有三种方式:

      @execute phase="" lifecycle=""
      @execute phase=""
      @execute goal=""

      package net.oseye;
      
      import org.apache.maven.plugin.AbstractMojo;
      import org.apache.maven.plugin.MojoExecutionException;
      /**
       * @goal oseye
       * @execute phase="compile"
       */
      public class MyMojo extends AbstractMojo{
          public void execute()throws MojoExecutionException
          {
          	getLog().info("这是一个测试插件,goal是oseye");
          }
      }
      这个示例表示当maven执行goal时,先把项目build到compile阶段后在执行goal。
    6. @phase
      这个标注表示默认的phase,如:
      package net.oseye;
      
      import org.apache.maven.plugin.AbstractMojo;
      import org.apache.maven.plugin.MojoExecutionException;
      /**
       * @goal oseye
       * @phase validate
       */
      public class MyMojo extends AbstractMojo{
          public void execute()throws MojoExecutionException
          {
          	getLog().info("这是一个测试插件,goal是oseye");
          }
      }
      这个goal默认的是绑定validate阶段,但这个不能自动在validate阶段执行这个goal,必须配置:
       <build>
          <plugins>
      		 <plugin>
      		    <groupId>net.oseye</groupId>
      			<artifactId>MvnPluginDemo</artifactId>
      			<version>0.0.1-SNAPSHOT</version>
      			<executions>
      				<execution>
      				    <goals>
      				       <goal>oseye</goal>
      				    </goals>
      				</execution>
      			</executions>
      		 </plugin>
          </plugins>
        </build>
      这是执行
      mvn compile
      首先是执行compile之前的phase,其中就有validate,因为配置中没有绑定phase,所以就默认validate。当执行到validate时就执行这个goal。但如果配置了
       <build>
          <plugins>
      		 <plugin>
      		    <groupId>net.oseye</groupId>
      			<artifactId>MvnPluginDemo</artifactId>
      			<version>0.0.1-SNAPSHOT</version>
      			<executions>
      				<execution>
      					<phase>compile</phase>
      				    <goals>
      				       <goal>oseye</goal>
      				    </goals>
      				</execution>
      			</executions>
      		 </plugin>
          </plugins>
        </build>
      那么就是把这个goal绑定了compile阶段。
    7. 参数
      插件可以接受从配置文件注入的数据,这里还是使用标注,格式是:
      @parameter expression="${aSystemProperty}" default-value="${anExpression}"
      插件代码
      package net.oseye;
      
      import org.apache.maven.plugin.AbstractMojo;
      import org.apache.maven.plugin.MojoExecutionException;
      /**
       * @goal oseye
       * @phase validate
       */
      public class MyMojo extends AbstractMojo{
      	/**
      	* @parameter expression=”${oseye.words}” default-value=”goodBye to you!”
      	*/
      	private String words;
          public void execute()throws MojoExecutionException
          {
          	getLog().info("这是一个测试插件,goal是oseye"+words);
          }
      }
      配置
       <build>
          <plugins>
      		 <plugin>
      		    <groupId>net.oseye</groupId>
      			<artifactId>MvnPluginDemo</artifactId>
      			<version>0.0.1-SNAPSHOT</version>
      			<executions>
      				<execution>
      					<phase>compile</phase>
      				    <goals>
      				       <goal>oseye</goal>
      				    </goals>
      					<configuration>
      					 <words>goodbye everyone</words>
      					</configuration>
      				</execution>
      			</executions>
      		 </plugin>
          </plugins>
        </build>
      输出

      [INFO] 这是一个测试插件,goal是oseyegoodbye everyone

      插件只有能够配置传参才具有生产意义。
    出处:http://www.zhaiqianfeng.com    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    变更管理
    2020软件工程个人作业06——软件工程实践总结作业
    鸽子开发组---冲刺第七天
    冲刺第六天
    鸽子开发组---冲刺第五天
    鸽子开发组--冲刺第四天
    鸽子开发组--冲刺第三天
    鸽子开发组--冲刺第二天
    冲刺规划
    冲刺第一天
  • 原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4620139.html
Copyright © 2020-2023  润新知