IntelliJ IDEA 2022社区版编译时无法处理Lombok注解问题
在IntelliJ IDEA 2022社区版中配置Lombok使用,项目未采用Maven、Gradle等构建系统,已手动配置源码目录、测试目录与输出目录。
当前IntelliJ编辑器可正常识别Lombok,调用Lombok生成的setter、getter时编辑器无报错,仅编译阶段出现错误。
执行build操作时,普通Java代码可正常编译,但Lombok注解未被处理:输出文件夹中生成了generated与generated_tests目录,按预期该目录应存放注解处理完成后的Java代码,但实际目录为空;未使用Lombok生成方法的类编译后class文件正常生成在常规输出目录中。
构建输出出现如下警告:
java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process "jps.track.ap.dependencies" VM flag to enable/disable incremental annotation processing environment.
如果源码中调用Lombok生成的setter、getter,构建直接失败,报错如下:
java: cannot find symbol symbol: method getName() location: class mypackage.MyClass
已尝试以下常见解决方案,问题仍未解决:
- 确认IDEA内置Lombok插件已安装并启用
- 在
Settings > Build, Execution, Deployment > Compiler > Annotation Processors配置页,勾选Enable annotation processing与Obtain processors from project classpath选项 - 在
Settings > Build, Execution, Deployment > Compiler配置页的"User-local build process VM Options"设置项中,添加-Djps.track.ap.dependencies=false参数 - 使用最新版Lombok(1.18.24版本),从Project Lombok官网下载jar包作为外部库引入项目
- 完成以上配置后,执行缓存失效操作并重启IDE
其他环境信息:
- 使用OpenJDK 18作为运行环境
补充日志
不调用Lombok生成setter、getter的场景下重建项目,log/build.log写入日志如下:
2022-06-14 22:50:45,429 [ 32] INFO - #o.j.j.c.BuildMain - Build process started. Classpath: C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2022.1.2/plugins/java/lib/jps-launcher.jar 2022-06-14 22:50:45,687 [ 290] INFO - #o.j.j.c.BuildMain - Connection to IDE established in 234 ms 2022-06-14 22:50:45,857 [ 460] INFO - #o.j.j.c.JpsModelLoaderImpl - Loading model: project path = C:/Users/laxon/Desktop/Coding/Languages/Java/LombokTest, global options path = C:/Users/laxon/AppData/Roaming/JetBrains/IdeaIC2022.1/options 2022-06-14 22:50:46,037 [ 640] INFO - #o.j.j.c.JpsModelLoaderImpl - Model loaded in 179 ms 2022-06-14 22:50:46,037 [ 640] INFO - #o.j.j.c.JpsModelLoaderImpl - Project has 1 modules, 3 libraries 2022-06-14 22:50:46,111 [ 714] INFO - #c.i.u.i.FilePageCache - lower=100; upper=500; buffer=10; max=980 2022-06-14 22:50:46,557 [ 5] INFO - #o.j.j.c.BuildMain - ================================================== 2022-06-14 22:50:46,584 [ 32] INFO - #o.j.j.c.BuildMain - Build process started. Classpath: C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2022.1.2/plugins/java/lib/jps-launcher.jar 2022-06-14 22:50:46,852 [ 300] INFO - #o.j.j.c.BuildMain - Connection to IDE established in 251 ms 2022-06-14 22:50:47,047 [ 495] INFO - #o.j.j.c.JpsModelLoaderImpl - Loading model: project path = C:/Users/laxon/Desktop/Coding/Languages/Java/LombokTest, global options path = C:/Users/laxon/AppData/Roaming/JetBrains/IdeaIC2022.1/options 2022-06-14 22:50:47,219 [ 667] INFO - #o.j.j.c.JpsModelLoaderImpl - Model loaded in 171 ms 2022-06-14 22:50:47,219 [ 667] INFO - #o.j.j.c.JpsModelLoaderImpl - Project has 1 modules, 3 libraries 2022-06-14 22:50:47,283 [ 731] INFO - #c.i.u.i.FilePageCache - lower=100; upper=500; buffer=10; max=980 2022-06-14 22:50:47,432 [ 880] INFO - #o.j.j.i.IncProjectBuilder - Building project; isRebuild:true; isMake:false parallel compilation:false 2022-06-14 22:50:47,433 [ 881] INFO - #o.j.k.j.b.KotlinBuilder - is Kotlin incremental compilation enabled for JVM: true 2022-06-14 22:50:47,433 [ 881] INFO - #o.j.k.j.b.KotlinBuilder - is Kotlin incremental compilation enabled for JS: true 2022-06-14 22:50:47,437 [ 885] INFO - #o.j.k.j.b.KotlinBuilder - is Kotlin compiler daemon enabled: true 2022-06-14 22:50:47,437 [ 885] INFO - #o.j.k.j.b.KotlinBuilder - Label in local history: build started 9039cfb8 2022-06-14 22:50:47,472 [ 920] INFO - #o.j.j.b.i.CompilerReferenceIndex - backward reference index deleted java.lang.Exception at org.jetbrains.jps.backwardRefs.index.CompilerReferenceIndex.removeIndexFiles(CompilerReferenceIndex.java:190) at org.jetbrains.jps.backwardRefs.index.CompilerReferenceIndex.removeIndexFiles(CompilerReferenceIndex.java:183) at org.jetbrains.jps.backwardRefs.JavaBackwardReferenceIndexWriter.initialize(JavaBackwardReferenceIndexWriter.java:69) at org.jetbrains.jps.incremental.java.JavaBuilder.buildStarted(JavaBuilder.java:173) at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:444) at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:197) at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:150) at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:348) at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:175) at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:218) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) 2022-06-14 22:50:47,472 [ 920] INFO - #o.j.j.b.i.CompilerReferenceIndex - backward reference index version doesn't exist 2022-06-14 22:50:47,653 [ 1101] INFO - #o.j.j.i.IncProjectBuilder - Cleaned output directories in 49 ms 2022-06-14 22:50:47,887 [ 1335] INFO - #o.j.k.j.b.KotlinBuilder - KotlinTargetsIndex created in 31 ms 2022-06-14 22:50:47,900 [ 1348] INFO - #o.j.k.j.b.KotlinBuilder - Total Kotlin global compile context initialization time: 48 ms 2022-06-14 22:50:48,377 [ 1825] INFO - #o.j.j.i.j.JavaBuilder - Compiling 1 java files; module: LombokTest 2022-06-14 22:50:49,880 [ 3328] INFO - #o.j.j.i.j.JavaBuilder - Compiling 1 java files; module: LombokTest (tests) 2022-06-14 22:50:50,562 [ 4010] INFO - #o.j.j.c.BuildSession - Build duration: Builder 'Backward references indexer' took 65 ms; 0 sources processed 2022-06-14 22:50:50,562 [ 4010] INFO - #o.j.j.c.BuildSession - Build duration: Builder 'Java' took 1 s 913 ms; 2 sources processed (956 ms per file) 2022-06-14 22:50:50,562 [ 4010] INFO - #o.j.j.c.BuildSession - Build duration: Builder 'Kotlin Builder' took 538 ms; 0 sources processed 2022-06-14 22:50:50,567 [ 4015] INFO - #o.j.j.i.j.JavaBuilder - javac 18.0.1.1 was used to compile [LombokTest] 2022-06-14 22:50:50,937 [ 3] INFO - #o.j.j.c.BuildMain - ================================================== 2022-06-14 22:50:50,963 [ 29] INFO - #o.j.j.c.BuildMain - Build process started. Classpath: C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2022.1.2/plugins/java/lib/jps-launcher.jar 2022-06-14 22:50:51,217 [ 283] INFO - #o.j.j.c.BuildMain - Connection to IDE established in 233 ms 2022-06-14 22:50:51,238 [ 304] INFO - #c.i.o.u.i.w.IdeaWin32 - Native filesystem for Windows is operational 2022-06-14 22:50:51,262 [ 328] INFO - #o.j.j.c.JpsModelLoaderImpl - Loading model: project path = C:/Users/laxon/Desktop/Coding/Languages/Java/LombokTest, global options path = C:/Users/laxon/AppData/Roaming/JetBrains/IdeaIC2022.1/options 2022-06-14 22:50:51,441 [ 507] INFO - #o.j.j.c.JpsModelLoaderImpl - Model loaded in 177 ms 2022-06-14 22:50:51,441 [ 507] INFO - #o.j.j.c.JpsModelLoaderImpl - Project has 1 modules, 3 libraries 2022-06-14 22:50:51,512 [ 578] INFO - #c.i.u.i.FilePageCache - lower=100; upper=500; buffer=10; max=980 2022-06-14 22:50:51,662 [ 728] INFO - #o.j.j.c.BuildMain - Pre-loaded process ready in 725 ms 2022-06-14 22:50:51,722 [ 788] INFO - #o.j.j.c.BuildMain - Build canceled, but no build session is running. Exiting.
这个问题是IDEA 2022.1+搭配JDK18时,无构建工具场景下注解处理器路径识别异常导致的。之前勾选的Obtain processors from project classpath在手动导包场景下不会自动把Lombok加入注解处理器执行路径,按以下步骤操作即可:
- 打开
Settings > Build, Execution, Deployment > Compiler > Annotation Processors配置页,取消勾选Obtain processors from project classpath,选择下方的Processor path选项,点击右侧加号,手动把导入项目的Lombok jar包添加到路径中 - 删掉之前添加的
-Djps.track.ap.dependencies=falseVM参数,2022.1版本后这个参数会干扰注解处理器正常加载,弹出的JPS增量注解处理警告不用处理,不影响编译结果 - 打开项目结构的模块依赖配置,确认Lombok jar的依赖范围是
Compile,不要设为Provided——没有构建工具的情况下,IDEA不会自动把Provided范围的依赖加入编译时的注解处理器路径 - 删除输出目录下之前生成的空
generated、generated_tests文件夹,执行File > Invalidate Caches...清理缓存并重启IDE,重启后直接Rebuild Project即可
如果按以上操作仍失败,直接把JDK换成17 LTS版本。JDK18是短期迭代版本,IDEA 2022.1对它的注解处理流程适配存在已知bug,哪怕Lombok 1.18.24本身支持JDK18,搭配IDEA内置的JPS编译链也容易出现兼容问题。
内容的提问来源于stack exchange,提问作者Theone

