Java21+Lombok1.18.32+STS4.23.1中@Builder+@Singular编译报错
问题:Lombok @Builder + @Singular在STS 4.23.1中编译报错
基于Java 21、Lombok 1.18.32的应用中,编写了结合@Builder与@Singular注解的类,代码示例如下:
@Builder public class Naughty { private final @Singular("option") List<Option> options; }
在Spring Tools Suite 4.23.1中编译时出现注解编译错误,报错堆栈信息如下:
java.lang.NoSuchMethodError: 'void org.eclipse.jdt.internal.compiler.ast.CaseStatement.<init>(org.eclipse.jdt.internal.compiler.ast.Expression, int, int)' at lombok.eclipse.Eclipse.createCaseStatement(Eclipse.java:285) at lombok.eclipse.handlers.singulars.EclipseJavaUtilListSingularizer.appendBuildCode(EclipseJavaUtilListSingularizer.java:75) at lombok.eclipse.handlers.HandleBuilder.generateBuildMethod(HandleBuilder.java:821) at lombok.eclipse.handlers.HandleBuilder.handle(HandleBuilder.java:563) at lombok.eclipse.HandlerLibrary$AnnotationHandlerContainer.handle(HandlerLibrary.java:106) at lombok.eclipse.HandlerLibrary.handleAnnotation(HandlerLibrary.java:237) at lombok.eclipse.TransformEclipseAST$AnnotationVisitor.visitAnnotationOnType(TransformEclipseAST.java:269) at lombok.eclipse.EclipseNode.traverse(EclipseNode.java:107) at lombok.eclipse.EclipseAST.traverseChildren(EclipseAST.java:231) at lombok.eclipse.EclipseNode.traverse(EclipseNode.java:74) at lombok.eclipse.EclipseAST.traverseChildren(EclipseAST.java:231) at lombok.eclipse.EclipseNode.traverse(EclipseNode.java:69) at lombok.eclipse.EclipseAST.traverse(EclipseAST.java:224) at lombok.eclipse.TransformEclipseAST.go(TransformEclipseAST.java:226) at lombok.eclipse.TransformEclipseAST.transform(TransformEclipseAST.java:187) at lombok.eclipse.TransformEclipseAST.transform_swapped(TransformEclipseAST.java:104) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at lombok.launch.PatchFixesHider$Util.invokeMethod(PatchFixesHider.java:146) at lombok.launch.PatchFixesHider$Transform.transform_swapped(PatchFixesHider.java:272) at org.eclipse.jdt.internal.compiler.parser.Parser.endParse(Parser.java:11535) at org.eclipse.jdt.internal.core.util.CommentRecorderParser.endParse(CommentRecorderParser.java:131) at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12735) at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12965) at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12922) at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:11306) at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:850) at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:393) at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:1037) at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:1110) at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:280) at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:346) at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:186) at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:92) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:740) at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:805) at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1311) at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:132) at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:94) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:91) at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:158) at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:94) at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:107) at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:78) at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:207)
当前环境配置:
eclipse.buildId=4.23.1.202406150140 java.version=21.0.2 java.vendor=Oracle Corporation BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US Framework arguments: -product org.springframework.boot.ide.branding.sts4 Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.springframework.boot.ide.branding.sts4
问题原因
Lombok 1.18.32版本的Eclipse处理器依赖旧版Eclipse JDT的CaseStatement构造方法签名,而STS 4.23.1基于的Eclipse 2024-06版本已修改该方法参数,导致兼容性冲突,触发NoSuchMethodError。
解决方法
1. 升级Lombok版本
将Lombok升级至1.18.34或更高版本,这些版本已修复与Eclipse 2024-06及STS 4.23.x的兼容性问题。
- Maven项目修改依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.34</version> <scope>provided</scope> </dependency>
- Gradle项目修改依赖:
compileOnly 'org.projectlombok:lombok:1.18.34' annotationProcessor 'org.projectlombok:lombok:1.18.34'
2. 同步Lombok插件版本
确保STS中安装的Lombok插件版本与项目依赖版本一致:
- 打开STS,进入
Help > About > Installation Details - 在"Installed Software"中找到Lombok插件,查看版本
- 若版本不一致,通过
Help > Eclipse Marketplace搜索Lombok并更新插件
内容的提问来源于stack exchange,提问作者Jan Nielsen
相关产品推荐
相关产品推荐

