添加未使用的Lombok依赖引发编译间歇性StackOverflowError问题咨询
问题解答
1. 为何仅添加Lombok依赖(未使用注解)会导致编译时StackOverflowError?
Lombok依赖自带注解处理器,哪怕你没在代码里用任何Lombok注解,只要它出现在编译classpath中(provided scope仅限制运行时不包含,编译阶段仍会加载),Java编译器就会初始化这个处理器。结合你用的Java 21、老旧的Maven Compiler Plugin 3.1,以及Spring Boot 2.7的组合,部分旧版本Lombok的注解处理器在初始化时存在递归逻辑或兼容性问题,再加上编译缓存、处理器加载顺序的随机性,就会间歇性触发栈溢出。
2. 是否与注解处理器冲突(例如与<proc>only</proc>)相关?
是的,大概率有关。<proc>only</proc>会让编译器跳过常规编译,仅执行注解处理器逻辑。这种模式下,Lombok的处理器被加载后,可能和Log4j的注解处理器在初始化、类扫描阶段产生冲突;另外你在process-classes阶段自定义执行该配置,可能导致注解处理逻辑被重复触发,叠加Lombok处理器的兼容性问题,最终引发栈溢出。哪怕临时移除<proc>only</proc>仍出现失败,可能是编译缓存未彻底清理,或者Lombok处理器本身的初始化bug仍存在。
3. 是否有办法完全阻止Lombok干扰注解处理?
有几种可行方式:
- Maven中明确指定允许的注解处理器:在
maven-compiler-plugin里配置annotationProcessors参数,只加入Log4j的处理器,完全排除Lombok的处理器被加载。 - 从编译classpath移除Lombok注解处理器:通过Maven依赖排除,或者在编译器插件中配置
excludeArtifactIds,把Lombok的处理器排除在外。 - IntelliJ中手动关闭Lombok注解处理:进入
Build, Execution, Deployment -> Compiler -> Annotation Processors,取消勾选Enable annotation processing,或者在Processor path中移除Lombok相关依赖。
4. 如何彻底解决该问题?
推荐按以下步骤操作:
- 升级Maven Compiler Plugin版本:你当前用的3.1版本过于老旧,对Java 21支持极差,建议升级到3.11.0及以上(Spring Boot 2.7官方推荐的兼容版本)。
- 升级Lombok到兼容Java 21的版本:选择Lombok 1.18.30及以上版本,这些版本修复了大量Java 17+的兼容性问题,包括初始化时的栈溢出bug。
- 明确管控注解处理器列表:在
maven-compiler-plugin中配置annotationProcessors,只指定Log4j的注解处理器(比如org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor),避免Lombok处理器被意外加载。示例配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>21</source> <target>21</target> <annotationProcessors> <annotationProcessor>org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor</annotationProcessor> </annotationProcessors> </configuration> </plugin>
- 彻底清理编译缓存:执行
mvn clean install -U强制更新依赖并清理所有缓存,同时在IntelliJ中执行File -> Invalidate Caches...清除IDE缓存。 - 检查自定义
process-classes阶段配置:确认该阶段的注解处理逻辑是否必要,是否与默认编译阶段的处理重复,若重复可考虑调整或移除。
内容的提问来源于stack exchange,提问作者Yasin Ahmed
相关产品推荐
相关产品推荐

