maven插件编写

1. maven

maven作为一个优秀的项目管理工具,其插件机制提供了很多功能扩展。maven自带的插件足够满足我们的项目开发要求,不排除在某些特殊情况下,需要我们自己开发一个自己的插件来协助我们完成某些工作。maven官方例程提供了详细的解答,本文内容来源于官方例程。

Mojo是什么

Mojo 就是Maven plain Old Java Object。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。

3.maven命名规范

maven命名有要求,插件命名为-maven-plugin,而不推荐使用maven--plugin,因为后者是 Maven 团队维护官方插件的保留命名方式。

4.创建Mojo工程

创建maven插件工程与正常工程相似,本文为了方面使用IDEA创建。IDEA版本,2017.3, maven 3.6, 创建如图所示,记得要选用maven-archetype-mojo模板


maven插件编写_第1张图片
image.png

创建完成之后,首先我们来看pom文件


  4.0.0
  sample.plugin
  hello-maven-plugin
  maven-plugin
  1.0-SNAPSHOT
  hello-maven-plugin Maven Mojo
  http://maven.apache.org
  
    
      org.apache.maven
      maven-plugin-api
      2.0
    

    
      junit
      junit
      3.8.1
      test
    

    
    
      org.apache.maven.plugin-tools
      maven-plugin-annotations
      3.4
      provided
    
  

maven插件工程packaging方式为maven-plugin,并且自动导入了maven-plugin-api依赖。

5 创建简单Mojo

在第四步创建的工程里面添加GreetingMojo类。

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." );
    }
}

解释一下这个类,我们发现它继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。
Mojo 操作的实现我们了解了,那怎么让 Maven 知道这是一个 Mojo 而不是一个普通的 Java 类呢?这里,就需要说一下 Mojo 的查找机制了,在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。在上面的例子中,我们使用了 @MoJo 的方法来声明一个 Mojo。同样我们也可以使用 Javadoc 注解来进行声明。

6. 插件运行

首先将编写的插件打包上传到仓库,然后在其他项目的pom.xml 文件中引入插件


  
       ...
        
          sample.plugin
          hello-maven-plugin
          1.0-SNAPSHOT
        
  

执行命令

mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi

即可看到输出结果

[INFO] -----------------< com.sankuai:maven-springmvc-mysql >------------------
[INFO] Building maven-springmvc-mysql Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO] 
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ maven-springmvc-mysql ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar (0 B at 0 B/s)
[INFO] Hello, world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.052 s
[INFO] Finished at: 2019-06-16T16:29:27+08:00
[INFO] ------------------------------------------------------------------------
admindeMacBook-Pro-108:maven-springmvc-mysql hzjdemac$ 

7 其他

既然执行函数,没有参数是不完美的。maven插件支持在xml里面传入参数的形式。另外,还可以将插件的运行附加到构建生命周期中的某个特定阶段

  
    
      
        sample.plugin
        hello-maven-plugin
        1.0-SNAPSHOT
      
        Welcome      //传入greeting参数valu为Welcome
      
        
          
            compile        //编译器执行插件
            
              sayhi
            
          
        
      
    
  

参考:
[1]. http://maven.apache.org/plugin-developers/index.html

你可能感兴趣的:(maven插件编写)