注解处理器注册依赖构建工具在编译打包阶段生成meta-inf/services/javax.annotation.processing.processor文件,而非运行时生成;主流方式是使用autoservice注解自动创建该文件,或通过maven-jar-plugin手动配置服务声明。

注解处理器生成 META-INF/services/javax.annotation.processing.Processor 文件,不是靠注解处理器自己在运行时生成,而是由构建工具(如 Maven 或 Gradle)在编译打包阶段,根据你声明的处理器类自动写入的。关键在于:你得让构建工具“知道”哪个类是处理器,并配置它参与注解处理流程。
确保 Processor 类正确实现并声明
你的处理器类必须:
- 实现
javax.annotation.processing.Processor接口(或继承AbstractProcessor) - 提供无参构造方法
- 在类上用
@SupportedAnnotationTypes和@SupportedSourceVersion声明支持范围(非强制但强烈推荐) - 如果是 Java 9+ 模块项目,还需在
module-info.java中声明provides javax.annotation.processing.Processor with YourProcessorClass;
用 maven-compiler-plugin 显式注册(推荐方式)
Maven 默认不会自动发现和注册处理器 —— 它需要你明确告诉它:“这个 jar 里包含注解处理器”。做法是在 pom.xml 中配置 maven-compiler-plugin 的 annotationProcessorPaths(用于依赖中的处理器),或更常见的是:把处理器模块本身作为 compile 依赖,并启用 proc:only 或 proc:full。
但真正触发 META-INF/services/... 文件生成的,是 使用 maven-compiler-plugin 的 compilerArgs 配合 -processor 参数,或者更稳妥的方式:用 maven-compiler-plugin + annotationProcessorPaths + forceJavacCompilerUse。不过最直接可控的做法是:
- 在处理器模块的
pom.xml中添加maven-jar-plugin插件,手动写入服务文件:
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-jar-plugin</artifactid><version>3.3.0</version><configuration><archive><manifestentries><automatic-module-name>your.processor.module</automatic-module-name></manifestentries><services><service><type>javax.annotation.processing.Processor</type><provider>com.example.YourProcessor</provider></service></services></archive></configuration></plugin>
这个配置会让 Maven 在打 jar 包时,自动生成 META-INF/services/javax.annotation.processing.Processor,内容就是 com.example.YourProcessor。
用 annotation-processors 插件(简化方案)
如果你不想手写插件配置,可用社区插件 google/auto-service:
- 添加依赖:
com.google.auto.service:auto-service:1.1.1(注意 scope 为provided) - 在你的 Processor 类上加
@AutoService(Processor.class) - 编译时 auto-service 会在
target/generated-sources/annotations/下生成服务配置文件,并被 jar 插件一并打包进去
这是目前最常用、最省心的方式,无需手动维护路径或插件配置,适合绝大多数项目。
验证生成结果
执行 mvn clean package 后,解压生成的 .jar 文件,检查是否存在:
META-INF/
└── services/
└── javax.annotation.processing.Processor
该文件内容应为一行纯文本:com.example.YourProcessor(类全限定名,无空格、无空行)。
如果缺失,常见原因有:没加 @AutoService、没配 maven-jar-plugin 服务声明、或 jar 插件被其他插件覆盖导致 META-INF/services 未被包含。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











