NoSuchFieldError: Class JCTree$JCImport does not have member field
[已解决] NoSuchFieldError:类 JCTree$JCImport 没有成员字段
重建 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 的最新版本。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.32'
}
如果您已将 maven-compiler-plugin 添加到项目中,也不要忘记更新 maven-compiler-plugin 中的版本。
<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>
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 版本来修复它。