Java.lang.NoSuchMethodError: 'void org.eclipse.jdt.internal.compiler.ast.CaseStatement.<init>...'

В моем приложении 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

У Eclipse нет версии 4.23.1. Вы используете последнюю версию Lombok — попробуйте еще раз с последней версией Eclipse, прямо с download.eclipse.org .

nitind 24.06.2024 19:07

Это Spring Tools 4.23.1, основанная на Eclipse 2024-06 (4.32).

howlger 24.06.2024 20:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обходной путь — избежать аннотации @Singular, добавив заглушку компоновщика с достаточным количеством кода для решения проблемы; Ломбок позаботится обо всем остальном:

@Builder
public class Naughty {
    private final List<Option> options;

    public static class NaughtyBuilder {
        public NaughtBuilder option(Option option) {
            if (null == options) {
                options = new ArrayList<>();
            }

            options.add(option);

            return this;
        }
    }
}
Ответ принят как подходящий

Lombok пока не поддерживает Eclipse 2024-06 (4.32), на котором основаны Spring Tools 4.23.0 и 4.23.1, начиная с Lombok 1.18.34, выпущенного 28 июня 2024 года . Поэтому обязательно используйте текущую версию Lombok.

См. Проблема Lombok № 3688: [ОШИБКА] Поддержка Eclipse 2024-06 (4.32)

Подтверждено: «Острая морская свинка» от Lombok (1.18.33) работает — спасибо, @howlger!

Jan Nielsen 25.06.2024 09:21

Выпущена версия Lombok 1.18.34, которая исправляет эту проблему.

Jan Rieke 30.06.2024 20:57

Другие вопросы по теме

Похожие вопросы