必须使用@Mojo注解,因为它是Maven识别插件目标(goal)的唯一注册入口;缺失该注解或漏写name属性,会导致plugin.xml中无对应目标,命令执行时提示“Goal not found”。

开发Maven插件时必须使用@Mojo注解,是因为Maven核心引擎仅通过该注解识别哪些Java类可作为插件目标(goal)被调用;没有它,即使类继承了AbstractMojo,Maven在解析插件元数据时也会完全忽略该类,导致mvn your-plugin:your-goal命令报错“Goal not found”。
Mojo注解是Maven插件的“注册入口”
第一步:打开插件项目中的Mojo类,确认类声明上方有@Mojo注解。例如:@Mojo(name = "sayhi")。
第二步:检查该注解是否包含name属性——这是唯一必需字段,值将直接映射为命令行中冒号后的goal名称,如mvn myplugin:sayhi中的sayhi。
第三步:确认类继承自AbstractMojo或实现Mojo接口。仅加注解但未继承/实现,编译能过,运行时会因缺少execute()契约而抛出NoClassDefFoundError或AbstractMethodError。
这一步不能跳过——Maven在构建插件JAR时,会扫描所有含@Mojo的类并生成META-INF/maven/plugin.xml元数据文件;【缺失@Mojo注解的类不会出现在plugin.xml中,等于对Maven完全不可见】。
不加@Mojo注解会发生什么
方法一:删掉@Mojo注解,保留继承AbstractMojo和execute()方法。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
执行mvn clean compile无报错,但后续mvn myplugin:xxx必然失败,提示The goal you specified requires a plugin that does not exist——因为plugin.xml里根本没写这个goal。
方法二:保留@Mojo但漏写name属性。
Maven插件工具(maven-plugin-plugin)在生成plugin.xml阶段会直接中断构建,抛出Missing required @Mojo annotation attribute 'name'错误,连JAR都打不出来。
@Mojo注解还控制生命周期绑定
如果希望插件目标自动绑定到某个默认生命周期阶段(比如compile),必须显式设置defaultPhase属性:@Mojo(name = "validate", defaultPhase = LifecyclePhase.COMPILE)。
不设defaultPhase,该goal就只能手动触发(mvn your-plugin:validate),无法通过mvn compile间接执行。
注意:defaultPhase值必须是LifecyclePhase枚举的合法成员,填错字符串如"compil"会导致运行时报IllegalArgumentException,且错误堆栈不直观,排查耗时。

















