最简可用maven插件需三要素:继承abstractmojo的mojo类、@mojo(name="goal")注解、maven-plugin-api依赖;pom.xml必须设maven-plugin,并执行mvn clean install生成含plugin.xml的jar包。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

怎么写一个最简可用的 Maven 插件
能被 mvn 识别并执行的最小插件,核心就三样:Mojo 类、@Mojo 注解、maven-plugin-api 依赖。没别的——不配 pom.xml 的 <packaging>maven-plugin</packaging>,Maven 根本不会把它当插件加载。
常见错误是照着旧教程写了个类,但忘了加 @Mojo(name = "xxx"),或者用了 @Parameter 却没引入 maven-plugin-annotations(注意:它和 maven-plugin-api 是分开的,缺一不可)。
- 必须继承
AbstractMojo或实现Mojo接口(推荐前者) -
@Mojo的name值就是命令里用的 goal 名,比如@Mojo(name = "say-hello")→ 可执行mvn your-group:your-artifact:say-hello - 不要手动写
plugin.xml:Maven 3.5+ 默认启用注解处理器自动生成,前提是编译时 classpath 有maven-plugin-plugin的java-annotations执行器
为什么 mvn clean compile 后插件还是找不到
不是代码问题,是打包方式错了。Maven 插件不是普通 jar,必须声明 <packaging>maven-plugin</packaging>,否则 mvn install 生成的是普通 .jar,没有 plugin.xml 元数据,也没法被 PluginDescriptor 解析。
另一个高频坑:本地测试时没用 mvn install 装到本地仓库,而是直接 mvn your-plugin:goal —— 这会触发远程仓库查找,当然失败。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
- 确认
pom.xml顶层有<packaging>maven-plugin</packaging> - 运行
mvn clean install(不是package),确保生成的.jar里包含META-INF/maven/plugin.xml - 本地测试务必用完整坐标:
mvn groupId:artifactId:version:goal,或先在项目pom.xml中<plugin></plugin>块里声明再用缩写
@Parameter 怎么传值?为什么命令行参数总为空
@Parameter 默认绑定的是 plugin 配置块里的 XML 属性,不是命令行参数。想支持 -DmyParam=value,得加 property = "myParam",且变量名要和 -D 后一致。
类型也容易错:字符串不用处理,但 List<string></string> 或自定义对象必须配 @Parameter(defaultValue = "...") 或确保 XML 配置格式正确(如 <items><item>a</item></items>)。
- 命令行传参写法:
mvn your:goal -DmyParam=hello,对应字段:@Parameter(property = "myParam") private String myParam; - XML 配置写法(在
<plugin></plugin>内):<configuration><myparam>hello</myparam></configuration>,对应字段:@Parameter private String myParam; - 不要混用:没写
property就别指望-D生效;写了property却没加-D,字段就是 null
插件里调用其他 Maven 组件(比如获取 project 对象)要注意什么
MavenProject、MavenSession、Log 这些不是 new 出来的,必须通过 @Component 注入(来自 plexus-container-default)。硬 new 或静态缓存会导致空指针或状态错乱——因为 Mojo 实例由 Plexus 容器管理,生命周期和上下文绑定。
尤其注意日志:用 getLog().info(),别用 System.out,否则 CI 环境看不到输出,且无法被 Maven 的 quiet/debug 模式控制。
- 注入写法:
@Component private MavenProject project;(需引入maven-core依赖) - 不要在字段初始化块或 static 块里访问注入对象——容器还没完成注入
- 如果要用
RepositorySystem或ArtifactResolver,确认依赖范围是provided(它们由 Maven 运行时提供)
真正卡住人的往往不是语法,而是 Maven 的“隐式契约”:插件必须按它的容器规则活,不能当普通 Java 工具写。比如 project.getBuild().getOutputDirectory() 返回的路径,在不同生命周期阶段可能还没创建,直接 mkdirs() 不够,得先 Files.createDirectories() 并捕获 IOException。










