Maven支持任意新构建动作只需编写标注@Mojo的Java类并打包为jar,该jar含META-INF/maven/plugin.xml,Maven通过类路径扫描自动发现执行;插件是独立jar,依赖maven-plugin-api,由Plexus容器注入参数,生命周期绑定可通过pom.xml配置调整而无需修改代码。

要让Maven支持任意新构建动作——比如自动生成接口定义、校验API契约、触发灰度发布检查——你不需要修改Maven源码,也不用等官方更新,只需让一个Java类声明自己是Mojo,再打包成jar,Maven运行时就能自动发现并执行它。
插件即独立Jar包,不依赖Maven核心升级
每个Maven插件本质就是一个普通Maven项目编译出的jar包,只在pom.xml中声明对maven-plugin-api和maven-project的compile范围依赖。Maven启动时通过类路径扫描META-INF/maven/plugin.xml文件,读取其中定义的Mojo列表与生命周期绑定关系。这意味着只要JVM能加载这个jar,Maven框架就能识别它,哪怕你用JDK21开发、部署在JDK8环境里——只要API兼容,就可运行。
这一步操作起来很简单,直接把文件拖进去就行。
【plugin.xml必须放在jar包根目录的META-INF/maven/下,路径错一位就会导致Mojo完全不可见】
Mojo是可插拔的执行单元,不是硬编码逻辑
所有插件功能都封装在一个继承AbstractMojo(或AbstractProjectMojo)的Java类中,并用@Mojo注解标记:
@Mojo(name = "verify-openapi", defaultPhase = LifecyclePhase.VALIDATE, threadSafe = true)
其中name决定命令形式(mvn your-group:your-artifact:verify-openapi),defaultPhase决定是否自动绑定到生命周期——不设则只能显式调用;threadSafe = true表示该Mojo实例可在多线程构建中复用。
没有@Mojo注解的类,哪怕在同一个jar里,Maven也永远看不到它。
参数注入靠Plexus容器,无需手动new对象
Mojo类中声明的字段,只要标注@Parameter或@Component,就会在执行前由Maven内嵌的Plexus容器自动注入值:
@Parameter(defaultValue = "${project}", readonly = true)
private MavenProject project;
@Component
private MavenSession session;
这种机制让Mojo天然获得对当前项目结构、依赖树、构建配置的完整访问能力,而你不用写一行工厂代码或上下文传递逻辑。
如果删掉@Component却仍想用session,编译能过,运行时报NullPointerException——因为Plexus根本没给它赋值。
生命周期绑定靠配置,不改代码也能调整执行时机
第一步:在使用方项目的pom.xml中声明插件
第二步:在<configuration>外层添加<executions>节点
第三步:用<execution>指定目标goal、phase和id
例如将自定义验证插件从默认的VALIDATE阶段移到PRE_INTEGRATION_TEST阶段,只需改配置,不用动Mojo类本身。Maven会按新配置重新规划执行顺序,原有代码零修改。


















