一、如何手写一个maven plugin
maven plugin的作用就是在maven生命周期的某一个阶段去完成一个事情。
1.maven生命周期(lifecycle)中的每个阶段(phase)都可以绑定n(>=1)个插件(plugin)的目标(goal)
maven官方文档对生命周期和阶段的介绍
maven生命周期与阶段
2.多个goal绑定同一个phase的话,maven会从上到下依次执行
3.一个plugin中可以包含多个goal
4.maven插件的命名规则:maven-xxx-plugin xxx-maven-plugin(spring喜欢这种风格)
5.如何在idea中调试maven插件:如何调试maven插件
maven-plugin
org.apache.maven maven-plugin-api 3.5.2 org.apache.maven.plugin-tools maven-plugin-annotations 3.5.2 org.apache.maven.plugins maven-plugin-plugin 3.5 org.apache.maven maven-project 2.2.1
org.apache.maven.plugins maven-plugin-plugin 3.5
在注解里面写@goal 就会被识别到
/** * @goal comment * @version 1.0.0 * @since 1.0.0 * 注意:注释的方式不能与注解方式混用 */ public class CommentMoJo extends AbstractMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { Log log = getLog(); log.info("执行了goal:comment的execute方法"); } }
@Mojo注解的name就是goal的名字,defaultPhase设置默认绑定的phase,不写默认是package
@Mojo(name = "annotation", defaultPhase = LifecyclePhase.PACKAGE) public class AnnotationMoJo extends AbstractMojo { @Parameter(defaultValue = "${project}") private MavenProject project; @Parameter(required = true) private String name; @Parameter(required = false) private String age; @Override public void execute() throws MojoExecutionException, MojoFailureException { Log log = getLog(); log.info("执行了goal:annotation的execute方法"); // 获取到最终jar包的名字 String packaging = project.getPackaging(); String finalName = project.getBuild().getFinalName(); log.info("获取到最终jar包的名字:"+finalName+"."+packaging); log.info("name的值:"+name); log.info("age的值:"+age); } }
获取
// 获取maven pom文件上下文 @Parameter(defaultValue = "${project}") private MavenProject project; // required = true代表这个参数是必须的 @Parameter(required = true) private String name; @Parameter(required = false) private String age;
com.example
mavenplugin
0.0.2-SNAPSHOT
cgy
comment
package
comment
anno
package
annotation
commons-io
commons-io
2.13.0
org.springframework.boot
spring-boot-maven-plugin
2.6.11
repackage
package
repackage
这里有一个spring的打包插件
org.springframework.boot spring-boot-maven-plugin 2.6.11 repackage package repackage
alt+点击`
当插件的依赖不能传递时需要使用方显式的引入依赖。
commons-io commons-io 2.13.0 provided true
idea的maven插件
一般我们写java项目只需要用一个打包插件即可,我们通常使用`spring-boot-maven-plugin`和`maven assembly plugin`这两个插件
[spring-boot-maven-plugin介绍](https://zhuanlan.zhihu.com/p/634098705)
[maven-assembly-plugin插件的使用方法](https://cloud.tencent.com/developer/article/1354070)
[maven-assembly-plugin插件的官方使用方法](https://maven.apache.org/plugins/maven-assembly-plugin/usage.html)
[maven-assembly-plugin插件的assembly文件官方介绍](https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)
[自己写一个maven插件](https://www.bilibili.com/video/BV1au4y1e7rE?p=1&vd_source=e11238cac9f3e1ba071805e0deee4e23)
其他资料:
java编译加速那些事