升级到 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'
2 个回答
#1楼
已采纳
得票数 12
罪魁祸首就是Lombok。与 JDK 21 兼容的最小 Lombok 版本是 1.18.30。
这意味着最小的 Spring Boot 版本是 3.1.4,除非您想干预 Spring Boot 自动配置并将项目中的 Lombok 版本设置为与 Spring Boot 默认值不同。
不,这并不意味着最低启动版本是 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>
这是一种解决方法 - 通常最好不要干预 Spring Boot 自动配置的版本。它带来的伤害往往多于好处。
- Honza Zidek 2023-09-27
@HonzaZidek - 但我目前在这里找不到任何其他选择,几乎花了一天的时间。
- Arundev 2023-09-27
@HonzaZidek我们不需要排除它,它最初不起作用我不知道为什么,但是当我清除本地存储库并尝试一切看起来都正常
- Arundev 2023-09-28