Skip to content

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

总结

  1. 首选方案:升级 Lombok 到 1.18.22 或更高版本
  2. 临时方案:配置 Maven 编译器插件添加模块访问权限
  3. 备用方案:手动实现 Lombok 注解的功能

版本兼容性说明

  • Java 9-15:可能需要配置模块访问权限
  • Java 16+:建议使用 Lombok 1.18.22+ 版本
  • 最新 Java 版本:请始终使用最新的 Lombok 版本以确保兼容性

保持开发环境的依赖更新是避免此类问题的最佳实践。定期检查 Lombok 的更新日志和发行说明,以确保与新版 JDK 的兼容性。