首页 > 其他分享 >maven插件开发

maven插件开发

时间:2024-01-14 23:26:01浏览次数:28  
标签:插件 goal plugin maven 开发 phase lifecycle

  Maven 作为一个优秀的项目管理工具,其插件机制为其功能扩展提供了非常大的便捷性,本身它所有的功能都是插件完成的,maven自身只是一个框架。虽然说大多数情况下,我们可能不太会自己去编写 Maven 插件,但不排除在某些特殊的情况下,我们需要去完成一个自己的插件,来协助我们处理某些比较通用的事情,比如检查代码规范。插件和AOP掌握的好,开发效率绝对以一敌十。

Maven 插件的命名规范
一般来说,我们会将自己的插件命名为 <myplugin>-maven-plugin,而不推荐使用 maven-<myplugin>-plugin,因为后者是 Maven 团队维护官方插件的保留命名方式,使用这个命名方式会侵犯 Apache Maven 商标。可以说跟spring boot starter是一个路子。

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

第一个maven插件工程

maven插件工程本身是也是一个maven工程,唯一的区别是它的打包方式为maven-plugin,如下:

<packaging>maven-plugin</packaging>

其次,要依赖maven-plugin-api包开发,其中定义了maven插件开发必须的一些接口。如下:

    <artifactId>csc-maven-plugin</artifactId>
    <name>csc-maven-plugin</name>
    <packaging>maven-plugin</packaging>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.6.3</version>
            <scope>system</scope>
            <systemPath>D:/no-maven-jar/maven-plugin-api-3.6.3.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
package com.xxx.fff.maven.plugin.csc;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

/**
 * @author zjhua
 * @description 检查工具,在package阶段执行
 */
@Mojo(name="check")
public class CodingStyleCheckMojo extends AbstractMojo {
    @Parameter(property = "prop1")
    private String prop;
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("执行规范检查" + prop);
    }
}

  execute可以抛出两个异常:

  • org.apache.maven.plugin.MojoExecutionException:该异常标识发生非预期的错误,最后maven会展示"BUILD ERROR"。
  • org.apache.maven.plugin.MojoFailureException:该异常标识发生可预期的错误,最后maven会展示BUILD FAILURE,一般来说应使用后者。

带参数的Mojo

  实际中,不带参数的Mojo是很少的,而且作用也不是很大。只要在Mojo的属性上加上@Parameter注解,定义property属性即可。IDE可以自动识别插件的属性,如下:

    @Parameter( property = "prop1", defaultValue = "你好!" )
    private String prop;

  参数可以支持各种类型,包括map、list、数组等,可参见:http://maven.apache.org/guides/plugin/guide-java-plugin-development.html。

 

 

 

maven插件的核心概念

  maven的核心概念主要包括4个:lifecycle->phase->goal、mojo。

  • lifecycle:生命周期,这是maven最高级别的的控制单元,它是一系列的phase组成,也就是说,一个生命周期,就是一个大任务的总称,不管它里面分成多少个子任务,反正就是运行一个lifecycle,就是交待了一个任务,运行完后,就得到了一个结果,中间的过程,是phase完成的,自己可以定义自己的lifecycle,包含自己想要的phase。常见的lifecycle有 | clean | package ear | pageage jar | package war | site等等。
  • phase:可以理解为任务单元,lifecycle是总任务,phase就是总任务分出来的一个个子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的。下面就是一些default lifecycle的phase:

validate 
initialize 
generate-sources 
process-sources 
generate-resources 
process-resources
compile compile 
process-classes 
generate-test-sources 
process-test-sources 
generate-test-resources 
process-test-resources 
test-compile 
process-test-classes 
test 
prepare-package
package 
pre-integration-test 
integration-test 
post-integration-test 
verify 
install 
deploy 

  • goal: 这是执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中。 
  • mojo: lifecycle与phase与goal都是概念上的东西,mojo才是做具体事情的,可以简单理解mojo为goal的实现类,它继承于AbstractMojo,有一个execute方法,goal等的定义都是通过在mojo里定义一些注释的anotation来实现的,maven会在打包时,自动根据这些anotation生成一些xml文件,放在plugin的jar包里。

      抛开mojo不讲,lifecycle与phase与goal就是级别的大小问题,引用必须是从高级引用下级(goal绑定到phase,也可理间为phase引用goal,只是在具体绑定时,不会phase定义引用哪些goal,但是执行是,却是phase调用绑定到它那的goal),也不能跨级引用,如lifecycle可以引用任意的phase,不同lifecycle可以同时引用相同的phase,lifecycle不能跨级引用goal。goal会绑定到任意的phase中,也就是说不同的phase可以同时引用相同的goal,所以goal可以在一个lifecycle里被重复执行哦,goal自然也不能说绑定到lifecycle中,它们三者的关系可以用公司里的 总领导,组领导,与职员的关系来解释。

 

入门开发:https://blog.csdn.net/chinrui/article/details/66472815

Maven官方插件开发文档:http://maven.apache.org/plugin-developers/index.html、http://maven.apache.org/plugin-developers/cookbook/index.html、http://maven.apache.org/guides/plugin/guide-java-plugin-development.html

标签:插件,goal,plugin,maven,开发,phase,lifecycle
From: https://www.cnblogs.com/lightdb/p/12299127.html

相关文章

  • FlinkSQL实战开发
    FlinkSQL实战开发1、基础知识FlinkSQL分为TableAPI和SQLAPI,是架构于FlinkCore之上用SQL予以方便快捷地进行结构化数据处理的上层库。工作流程SQL和Table在进入Flink以后转化成统一的数据结构表达形式,也就是逻辑计划(logicplan),其中catalog提供元数据信息,用于后续的......
  • Maven配置换仓库出现错误1
    一:概述mvninstall后出现错误,寻找解决办法。二:具体过程<1>命令行使用mvninstall报错[INFO]Scanningforprojects...[INFO]------------------------------------------------------------------------[INFO]BUILDFAILURE[INFO]-----------------------------------------......
  • GEC6818开发板Linux环境中telnet的搭载
    一、首先打开开发板的Linux①通过232串口通信线连接开发板打开②打开网络配置文件(/etc/init.d/rcS)[root@GEC6818/]#vi/etc/init.d/rcS③用vi打开文件,在文件里面添加如下命令:#启动eth0网卡,并设置IP为192.168.1.124/sb......
  • (△△△)开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动
    描述开发一个坐标计算工具,A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。输入:合法坐标为A(或者D或者W或者S)+数字(两位以内)坐标之间以;分隔。非法坐标点需要进行丢弃。如AA10;......
  • 嵌入式软件开发人员有必要学习系统移植的知识吗?【ppt获取见文末】
    《从零开始学ARM》的配套视频说明为了让粉丝更好的学习我的新书里面的知识,一口君特地录制了配套学习视频,《从0学ARM第一期》《从0学ARM第一期》视频已经免费发布在B站,而书中除了ARM汇编、裸机开发等知识,还涉及到系统移植的一些知识点所以一口君干脆录制了一期《系统移植......
  • 【笔记-Blender】插件开发
    【笔记-Blender】插件开发前置工作打开设置“界面-开发选项”:这样可以通过对功能按钮的右键菜单直接复制或查看其源码,以及快速跳转到API手册。打开设置“界面-Python工具提示”:这样可以通过界面的悬停菜单直接查看该条目在代码中的表示方式。通过命令提示符打开Blender:这......
  • TDD(Test-Driven Development)测试驱动开发
    TDD(Test-DrivenDevelopment)是一种软件开发方法,其中开发人员在编写实际代码之前编写测试用例。TDD的基本思想是在开发过程中先编写测试,然后编写足够的代码来通过这些测试。TDD的一般流程通常包括以下阶段:编写测试用例(Test):开发人员首先编写一个测试用例,该用例描述了新功能或修......
  • 【JAVA基础】Java项目开发工具之Maven
    JAVA开发工具IDE有哪些?eclipce、idea、vscode等等IDEA比Eclipse更强大和高效。IDEA提供了更好的代码补全和重构功能,更好的代码导航和搜索功能,以及更好的支持多模块项目和多语言开发等。构建项目工具构建项目工具有哪些?Maven、Gradle、Ant等Maven管理和构建项目以及维护......
  • 基于SSM的图书商城网站的设计和开发
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的......
  • 我的世界1.20.1模组开发---13.添加新的附魔
    介绍  最近备战期末,又逢放假,休息了一阵子没有更新,这次来介绍一些有趣的东西,那就是游戏中的附魔系统。游戏中可以对我们的装备、武器和工具在附魔台上进行附魔,旁边还可以放书架来提升可附魔等级,当年第一次见到这个玩法的时候就吸引到我了,感觉附魔系统还挺有趣的,这次我们就好好说......