NoSuchFieldError: Class JCTree$JCImport does not have member field

洛克什・古普塔 2024 年 5 月 3 日
Lombok Java 21、Java 异常、Lombok

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

 1. 错误

构建项目时,JDK 21 升级后,构建错误如下所示:

java: 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。 [问题 3393]

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'
}

 4。结论

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

posted @ 2024-06-27 14:14  CharyGao  阅读(1209)  评论(0编辑  收藏  举报