lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment 错误解决方案
问题概述
当使用 OpenJDK 16 及以上版本运行 Lombok 项目时,可能会遇到以下错误:
java
java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor
(in unnamed module @0x3b67ef9b) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment
(in module jdk.compiler) because module jdk.compiler does not export
com.sun.tools.javac.processing to unnamed module @0x3b67ef9b
这个错误的原因是:从 Java 16 开始,JDK 加强了模块系统的访问控制,Lombok 无法再直接访问 JDK 编译器内部的 com.sun.tools.javac.processing
包。
解决方案
方案一:升级 Lombok 版本(推荐)
最佳解决方案
升级 Lombok 到 1.18.22 或更高版本,这些版本已经包含了对 Java 16+ 的兼容性修复。
在 Maven 项目中更新依赖:
xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
要查看最新的 Lombok 版本,请访问 Maven 中央仓库。
方案二:配置 Maven 编译器插件(临时方案)
如果暂时无法升级 Lombok,可以通过配置 Maven 编译器插件来解决:
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>16</source>
<target>16</target>
<fork>true</fork>
<compilerArgs>
<arg>--enable-preview</arg>
<arg>-Xlint:all</arg>
<!-- 添加必要的模块访问权限 -->
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
</compilerArgs>
<encoding>UTF-8</encoding>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
注意
此方案是临时解决方案,建议优先考虑升级 Lombok 版本。
方案三:手动实现 Lombok 功能(备用方案)
如果以上方案都不可行,可以考虑手动实现 Lombok 的 @Data
注解功能:
java
// 替代 @Data 注解的手动实现
public class Ingredient {
private final String id;
private final String name;
private final Type type;
public Ingredient(String id, String name, Type type) {
this.id = id;
this.name = name;
this.type = type;
}
// Getter 方法
public String getId() { return id; }
public String getName() { return name; }
public Type getType() { return type; }
// equals 和 hashCode 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ingredient that = (Ingredient) o;
return Objects.equals(id, that.id) &&
Objects.equals(name, that.name) &&
type == that.type;
}
@Override
public int hashCode() {
return Objects.hash(id, name, type);
}
// toString 方法
@Override
public String toString() {
return "Ingredient{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", type=" + type +
'}';
}
public enum Type {
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
}
}
总结
- 首选方案:升级 Lombok 到 1.18.22 或更高版本
- 临时方案:配置 Maven 编译器插件添加模块访问权限
- 备用方案:手动实现 Lombok 注解的功能
版本兼容性说明
- Java 9-15:可能需要配置模块访问权限
- Java 16+:建议使用 Lombok 1.18.22+ 版本
- 最新 Java 版本:请始终使用最新的 Lombok 版本以确保兼容性
保持开发环境的依赖更新是避免此类问题的最佳实践。定期检查 Lombok 的更新日志和发行说明,以确保与新版 JDK 的兼容性。