Ошибка компиляции после обновления до JDK 21 — «NoSuchFieldError: JCImport не имеет поля-члена, подходящего JCTree»

После обновления до JDK 21 в моем проекте Spring Boot возникла следующая ошибка компиляции:

Fatal error compiling: java.lang.NoSuchFieldError:
Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
6
0
2 846
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Виновник - Ломбок. Минимальная версия Lombok, совместимая с JDK 21, — 1.18.30.

Это означает, что минимальная версия Spring Boot — 3.1.4, если только вы не хотите вмешиваться в автоконфигурацию Spring Boot и устанавливать версию Lombok в своем проекте отлично от версии Spring Boot по умолчанию.

См.: https://github.com/projectlombok/lombok/issues/3393

Нет, это не означает, что минимальная версия загрузки — 3.1.4, вы можете вручную обновить Lombok, если хотите (я только что скомпилировал версию Spring Boot 2.7.x с более новой версией Lombok). Но если вам нужна определенная версия Java21 для всего спектра (поскольку она проверена на Java21), тогда действительно подойдет версия 3.1.4.

M. Deinum 25.09.2023 11:45

@M.Deinum Технически вы правы, однако я предпочитаю не вмешиваться в автоматически настроенные версии зависимостей в Spring Boot, если только нет действительно очень веской причины. Это часто приводит к еще большему беспорядку где-то неожиданно. И всегда кто-то забывает это в файле maven pom, и это вызывает проблемы позже.

Honza Zidek 25.09.2023 12:43

С чем я могу только согласиться, но это не единственный вариант. Кроме того, lombok — это немного другой зверь, для которого иногда нужны другие версии (хотя я бы предпочел, чтобы эта конкретная библиотека вообще не использовалась, но это личное предпочтение).

M. Deinum 25.09.2023 13:13

@M.Deinum Я обновил свой ответ соответственно :)

Honza Zidek 25.09.2023 14:15

Следуя первому ответу отсюда, я внес следующие изменения: ранее по умолчанию использовалась версия lombok 1.18.20, и мне нужно передать последние, которые решают проблему для меня, когда я перешел с весенней загрузки 2.XX на 3.3.3

Когда вы выполняете зависимость mvn:tree, вы можете увидеть, откуда берется более низкая версия, и если вы хотите исключить ее и новую или просто добавить новую и проверить еще раз, она все равно вытягивает старую версию, если не просто добавить новую, например ниже.

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>

Это обходной путь — обычно лучше не связываться с автоматически настроенными версиями Spring Boot. Зачастую это приносит больше вреда, чем пользы.

Honza Zidek 27.09.2023 14:54

@HonzaZidek - но сейчас я не могу найти здесь другого варианта, на это уходит почти день.

Arundev 27.09.2023 17:34

@HonzaZidek, нам не нужно его исключать, изначально это не работало, я не знаю почему, но когда я очистил локальный репозиторий и попробовал, все выглядело нормально

Arundev 28.09.2023 10:27

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