自己动手编写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

    插件只有能够配置传参才具有生产意义。
posted @ 2014-03-25 19:25  码农神说  阅读(532)  评论(0编辑  收藏  举报