前言在日常的maven项目开发中,我们自己开发maven插件的机会比较少,因为市面上的maven插件基本都可以满足我们日常的开发需求。Maven官方也提供了很多插件,详情可以参考以下链接https://maven.apache.org/plugins/index.html今天主要介绍开发一个maven插件的流程步骤-在开发中maven插件开发有两种,一种是基于javadoc开发,一种是基于注解开发javadoc开发。这个可以直接使用maven自带的skeleton选择maven-archetype-mojo生成模板。生成的模板如下/***Goal涉及时间戳文件。**@goaltouch**@phaseprocess-sources*/publicclassMyMojoextendsAbstractMojo{/***文件的位置。*@parameterexpression="${project.build.directory}"*@required*/privateFileoutputDirectory;publicvoidexecute()抛出MojoExecutionException{Filef=outputDirectory;如果(!f.exists()){f.mkdirs();}Filetouch=newFile(f,"touch.txt");文件写入器w=null;尝试{w=newFileWriter(touch);w.write("touch.txt");}catch(IOExceptione){thrownewMojoExecutionException("创建文件时出错"+touch,e);}finally{if(w!=null){try{w.close();}catch(IOExceptione){//忽略}}}}}这种骨架生成比较傻,有兴趣的可以试试,这里不展开讨论附录:maven文档开发常用doc说明各mojo必须使用@Goal注解来指明它的目标名称,否则maven将无法识别目标。还有很多其他的注解,罗列如下:@goal:唯一必须声明的注解。当用户调用命令行或者在pom中配置插件时,需要使用目标名称。如果你运行的是compiler:compiletarget,compiler是插件的goalPrefix,compile是目标的名字@phase:默认情况下,目标绑定到默认的某个阶段语句循环,这样在配置和使用插件目标的时候,就不需要声明阶段了,比如maven-surefire-pluginmaven-surefire-plugin的测试目标在注解@requiresDependencyResolution测试中用@标示phasetes@requiresDependencyResolution:在运行mojo之前,必须解析指定范围的所有依赖项。Thedependenciesmustberesolved@requiresProject:这个目标是否必须在maven项目中运行(比如测试其他项目的测试插件),默认为true。大多数插件目标都需要依赖一个项目来运行,但maven-help-plugin的系统目标是个例外,它用于在没有实际项目的情况下显示系统属性和环境变量信息。@requiresOnline:是否要求maven在线,默认为false@requiresReport:是否要求项目报告已经生成,默认为false@aggregator:当mojo为runningonamulti-moduleproject,表示目标只会在顶层模块中运行。@requiresDirectInvocation:为true时,只能通过命令行直接调用目标。默认是false@executegoal="":在运行这个目标之前,让maven运行另一个目标。如果是这个插件的目标,直接调用目标名,否则,使用"prefix:goal"@executephase="":在运行目标之前,让maven运行一个并行生命周期到指定的阶段,直到.插件目标@executelifecycle=""phase="":在运行目标之前,让maven运行一个自定义的生命周期,直到指定的阶段。parameters:这个元素描述了Mojo的所有参数。name,type,required,editable(是否允许在pom.xml中设置),description,比如@parameter可以用来标记mojo的一个字段为可配置参数,即mojo参数。支持boolean,int,float,String,Date,File,Urlarray,Collection,map,Properties配置:为所有Mojo参数提供默认值注:本说明摘自博主bobozai86的博客https://blog.csdn。net/bobozai86/article/details/106179288注解开发1.pom.xml引入org.apache.mavenmaven-plugin-api3.5.2提供org.apache.maven.plugin-toolsmaven-plugin-annotations3.5.2provided注意:pom的打包需要指定为maven-plugin2,编写插件类继承org.apache.maven.plugin.AbstractMojo@Mojo(name="echo",defaultPhase=LifecyclePhase.PACKAGE)公共类EchoMojo扩展AbstractMojo{@ParameterprivateSt铃声应用程序名称;publicvoidexecute()throwsMojoExecutionException,MojoFailureException{getLog().info("echo-->"+applicationName);}}@Mojo就是告诉maven这不是一个普通的java类,而是一个mojo插件类,defaultPhase这个是指定maven生命周期的哪个阶段触发插件的执行。它可以在以下阶段触发@Parameter函数的执行。它提供了挂钩,允许用户调整插件的操作以满足他们的需要。它提供了一种无需导航对象即可轻松从POM中提取元素值的方法。这段话来自官网,主要作用是提供hooks,让用户根据自己的需要调整插件的运行,并可以从pom文件中提取参数一般情况下,这个参数可以从插件的配置标签中提取出来。3、将写好的插件安装到本地仓库,执行命令mvncleaninstall。执行过程中可能会报如下异常org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor(default-descriptor)报错原因是没有指定maven-plugin-plugin版本,所以默认是3.2,不适合现在的代码,所以指定版本,在pom文件plugins中加入org.apache.maven.pluginsmaven-plugin-plugin3.5如何在项目中使用自定义插件以示例项目的插件为一个例子,引入com.github.lybgeekecho-maveninpom.xml-plugin1.0-SNAPSHOT<配置>springboot-echopackageechoExecutemvncleanpackage总结maven插件可以看作是maven在执行生命周期阶段的一个钩子函数。如果我们在maven执行编译、打包、安装、部署等阶段触发了一些事情,我们可以考虑实现一个maven插件,比如生成离线接口文档。其实官网也提供了非常详细的开发maven插件的开发指南。感兴趣的朋友,可以查看以下链接https://maven.apache.org/guides/plugin/guide-java-plugin-development.htmldemo链接https://github.com/lyb-geek/springboot-learning/tree/master/springboot-maven-插件