注解处理器注册依赖构建工具在编译打包阶段生成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。不过最直接可控的做法是:
立即学习“Java免费学习笔记(深入)”;
- 在处理器模块的
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 未被包含。



















