APT在Maven中本质是通过maven-compiler-plugin启用编译期注解处理,需配置annotationProcessorPaths、禁用-proc:none、避免skip,并可选传入compilerArgs控制处理器行为。

在 Maven 中配置 APT(Annotation Processing Tool)处理器,本质是让 maven-compiler-plugin 在编译阶段识别并执行注解处理器(如 Lombok、MapStruct、AutoService 等),关键在于正确设置 annotationProcessorPaths 和启用注解处理机制。
启用注解处理器支持
从 Maven Compiler Plugin 3.5 开始,annotationProcessors 和 annotationProcessorPaths 成为标准配置项。默认情况下,插件会自动发现 classpath 中的 META-INF/services/javax.annotation.processing.Processor(Java 8/9)或 org.openjdk.jdk.compiler.annotation.processing.Processor(Java 17+)——但前提是:必须显式开启注解处理,且不能跳过。
- 确保未设置
<compilerArgument>-proc:none</compilerArgument> - 不要设置
<skip>true</skip>或<skipMain>true</skipMain> - 推荐显式启用:
<compilerArgs><arg>-proc:only</arg></compilerArgs>(仅处理注解,不编译)或默认的-proc:full(默认行为)
指定注解处理器路径(annotationProcessorPaths)
当处理器不在主模块依赖中(例如使用第三方 APT 工具但不想将其作为运行时依赖),应通过 annotationProcessorPaths 隔离引入,避免污染 compile 范围。
示例:集成 MapStruct(仅需编译期)
立即学习“Java免费学习笔记(深入)”;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
传递自定义 APT 参数(compilerArgs)
部分处理器(如 ErrorProne、Checker Framework)需额外参数控制行为。使用 compilerArgs 传入:
-
-Xplugin:ErrorProne(ErrorProne) -
-AsuppressWarnings=unchecked(Lombok 或自定义 processor) -
-Amapstruct.suppressGeneratorTimestamp=true(MapStruct)
完整示例:
<compilerArgs> <arg>-Xplugin:ErrorProne</arg> <arg>-Xep:MissingOverride:ERROR</arg> <arg>-Amapstruct.defaultComponentModel=spring</arg> </compilerArgs>
兼容 Java 9+ 的模块化注解处理
若项目启用 JPMS(module-info.java),需确保处理器 JAR 包含 Automatic-Module-Name 或已声明为命名模块;否则 Maven 可能无法加载。可添加如下兜底配置防止 silent failure:
<showWarnings>true</showWarnings>-
<verbose>true</verbose>—— 查看是否打印Processing environment initialized with X processors - 编译时加
-X(mvn compile -X)确认 processor 是否被识别和调用


















