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(仅需编译期)
<plugin><groupid>org.apache.maven.plugins</groupid><maven-compiler-plugin><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></maven-compiler-plugin></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 是否被识别和调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











