升级到 JDK 21 后出现编译错误 - "NoSuchFieldError: JCImport does not have member field JCTree qualid"

回答 2 浏览 2580 2023-09-25

升级到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'
Honza Zidek 提问于2023-09-25
2 个回答
#1楼 已采纳
得票数 12

罪魁祸首就是Lombok。与 JDK 21 兼容的最小 Lombok 版本是 1.18.30

这意味着最小的 Spring Boot 版本是 3.1.4,除非您想干预 Spring Boot 自动配置并将项目中的 Lombok 版本设置为与 Spring Boot 默认值不同。

请参阅:https://github.com/projectlombok/lombok/issues/3393

Honza Zidek 提问于2023-09-25
Honza Zidek 修改于2023-09-25
不,这并不意味着最低启动版本是 3.1.4,如果您愿意,您可以手动升级 Lombok(我刚刚使用较新的 lombok 版本编译了 Spring Boot 2.7.x 版本)。但如果您想要整个范围内的某个 Java21(因为这是使用 Java21 进行测试的),那么 3.1.4 确实是合适的版本。M. Deinum 2023-09-25
@M.Deinum 从技术上讲,你是对的,但是我不喜欢在 Spring Boot 中干预自动配置的依赖版本,除非有一个确实非常好的理由。它常常会给其他意想不到的地方带来更多混乱。总是有人在 Maven pom 文件中忘记这一点,这会导致以后出现问题。Honza Zidek 2023-09-25
我只能同意这一点,但这不是唯一的选择。另外,lombok 是一个有点不同的野兽,有时您需要有另一个版本(尽管我宁愿看到根本不使用该特定库,但这是个人偏好)。M. Deinum 2023-09-25
@M.Deinum 我相应地更新了我的答案:)Honza Zidek 2023-09-25
#2楼
得票数 0

遵循这里的第一个答案,我进行了以下更改,之前它将 lombok 版本 1.18.20 作为默认值,当我从 Spring Boot 2.XX 迁移到 3.3.3 时,我需要提供最新的内容来解决我的问题

当执行 mvn dependency:tree 时,您可以看到较低版本来自何处,如果 yopu 想要排除该版本和新版本或只是添加新版本并再检查一次,仍然会拉动旧版本,如果不添加新的,如下所示。

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
Arundev 提问于2023-09-27
Arundev 修改于2023-09-28
这是一种解决方法 - 通常最好不要干预 Spring Boot 自动配置的版本。它带来的伤害往往多于好处。Honza Zidek 2023-09-27
@HonzaZidek - 但我目前在这里找不到任何其他选择,几乎花了一天的时间。Arundev 2023-09-27
@HonzaZidek我们不需要排除它,它最初不起作用我不知道为什么,但是当我清除本地存储库并尝试一切看起来都正常Arundev 2023-09-28