NoSuchFieldError: Class JCTree$JCImport does not have member field

重建 Java 或 Spring 应用程序时,升级 Java 21 后,您可能会在构建过程中遇到 “NoSuchFieldError: Class JCTree$JCImport does not have member field” 的问题。让我们学习如何修复它。

 1. 错误

构建项目时(比如:mvn package),JDK 21 升级后,构建错误如下所示:

jdk21 maven-compiler-plugin:3.11.0:compile java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport 
  does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
  ...
  ...

2. 根本原因

com.sun.tools.javac.tree.JCTree$JCImport 类(包括其 “qualid” 字段)是 Java 编译器 (javac) 内部实现的一部分。它以抽象语法树(AST)的形式存储 Java 源代码的内部表示。它不适用于常规编程任务。

为了使用注释提供其功能,Lombok 通过反射访问其字段 “qualid” 来访问此内部 JDK API (com.sun.tools.javac.tree.JCTree$JCImport)。该字段在 Java 21 中已更改。直到 Java 20,它的类型为 JCTree。在 Java 21 中,其类型已更改为 JCFieldAccess

public JCTree qualid;  //Java 20 and before

public JCFieldAccess qualid;  //Java 21 and Later

相应的更改已在 “Lombok 1.18.30” 中完成。

3. 解决方案

为了解决这个错误,我们需要将 Lombok 版本升级到 1.18.30 或更高版本。该问题已在该版本中得到修复。建议始终更新到 Lombok 的最新版本。

pom.xml

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

build.gradle

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.32'
}

如果您已将 maven-compiler-plugin 添加到项目中,也不要忘记更新 maven-compiler-plugin 中的版本

pom.xml

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
      <source>22</source>
      <target>22</target>
      <enablePreview>true</enablePreview>
      <annotationProcessorPaths>
        <path>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.32</version>
        </path>

        //...
        </annotationProcessorPaths>
      <compilerArgs>--enable-preview</compilerArgs>
    </configuration>
  </plugin>
</plugins>

build.gradle

plugins {
    id 'java'
}

dependencies {
    annotationProcessor 'org.projectlombok:lombok:1.18.32'
    implementation 'org.projectlombok:lombok:1.18.32'
}

总结:本文讨论了由 Lombok 引起的 “NoSuchFieldError:类 JCTree$JCImport 没有成员字段” 以及如何通过更新依赖项文件中的 Lombok 版本来修复它。 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值