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

Hon*_*dek 150 compiler-errors upgrade lombok spring-boot java-21

升级到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'
Run Code Online (Sandbox Code Playgroud)

Hon*_*dek 253

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

这意味着最小的 Spring Boot 版本是3.1.4,除非您想干预 Spring Boot 自动配置并在项目中设置与中定义的Spring Boot BOM不同的 Lombok 版本spring-boot-dependencies不同的 Lombok 版本。

请参阅:[BUG] Lombok 1.8.26 与 JDK 21 不兼容 #3393

  • 不,这并不意味着最低启动版本是 3.1.4,如果您愿意,您可以手动升级 Lombok(我刚刚使用较新的 lombok 版本编译了 Spring Boot 2.7.x 版本)。但如果您想要整个范围内的某个 Java21(因为这是使用 Java21 进行测试的),那么 3.1.4 确实是合适的版本。 (11认同)
  • @M.Deinum 从技术上讲你是对的,但是我不喜欢在 Spring Boot 中干预自动配置的依赖版本,除非有一个*真的*非常好的理由。它常常会给其他意想不到的地方带来更多混乱。总是有人在 Maven pom 文件中忘记这一点,这会导致以后出现问题。 (2认同)

Aru*_*dev 17

我按照这里的第一个答案进行了以下更改。以前,它默认使用 Lombok 版本 1.18.20,当我从 Spring Boot 2.XX 迁移到 3.3.3 时,我需要提供最新版本来解决问题。

在执行mvn dependency:tree时,您可以查看较低版本的来源,以及是否要排除该版本和新版本,或者只是添加新版本并再检查一次。仍然拉动旧版本。如果没有,只需添加一个新的,如下所示。到目前为止,这个解决方案没有任何问题。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 这是一种解决方法 - *通常*最好不要干扰 Spring Boot 自动配置的版本。它带来的伤害往往多于好处。 (2认同)