java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment

回答 3 浏览 35.4万 2021-03-25

我是编码新手,正试图使用 Lombok 插件为特定类的字段自动创建 Getters/Setters 等。在此过程中,我遇到了以下错误:

错误:

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

在网上进行一些搜索后,我发现这个错误与 OpenJDK 15 中的一个问题有关,但我目前使用的是 OpenJDK 16,因此我对仍然收到此错误感到困惑。

该主题声称有一个解决方案:https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-748616687 ,但在使用该插件后,似乎没有任何区别,我仍然收到该错误。

因为我是初学者,所以我很可能犯了一个小错误,但如果有人知道我缺少什么,请告诉我。

使用 @Data 的类(Lombok):

import lombok.Data;

@Data
public class Ingredient {

    private final String id;
    private final String name;
    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }

}

我的 Pom 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>sia</groupId>
    <artifactId>taco-cloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>taco-cloud</name>
    <description>Taco Cloud Project</description>
    <properties>
        <java.version>16</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
Dainank 提问于2021-03-25
如果您使用的是 JDK16,为什么不使用记录?如果您是初学者,为什么不使用基础知识来学习它们如何工作?众所周知,在 JDK16 上发布的版本中,Lombok 无法正常工作......因此您必须等待更新版本的推出,或者直接使用纯 Java ......(集成开发环境在这方面可以提供很大帮助......) .... khmarbaise 2021-03-25
顺便说一句:你能说出你在哪里找到的:.. is related to an issue in OpenJDK 15..?khmarbaise 2021-03-25
是的,JDK16 已经关闭了之前处于打开状态的东西(JDK 中的内部东西),这些东西正在被 Lombok 等使用,而且很明显,在很长一段时间内,关闭将会发生......khmarbaise 2021-03-25
@khmarbaise 作为提醒,我选择删除 Lombok 依赖项,而是将我的 Getters、Setters 等设置为手动在代码中。之后我的应用程序成功运行。Dainank 2021-03-25
我在使用 open jdk 13 的 mac 上进行 maven clean install 时遇到了类似的错误。我将 java 版本降级到 11 并且能够构建项目而没有错误。[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project phms-domain: Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (Arv 2022-04-12
3 个回答
#1楼 已采纳
得票数 480

至少切换到包含修复的 Lombok 1.18.22 版本

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.28</version>
</dependency>

要查看 lombok 的最新版本,请点击 search.maven.org

FrankyFred 提问于2021-04-07
Rajanboy 修改于2023-09-05
我仍然收到此版本 (1.18.20) 和 Java 16 的错误。当我降级到 Java 15 时,该错误消失。Tigerware 2021-04-07
为我工作,我正在使用 Java 16NiB 2021-08-03
这在 Java 17 中对我有用..谢谢。Arefe 2021-12-09
openjdk 11下的WoksErick Audet 2022-01-07
为我工作,openjdk 版本“11.0.13”2021-10-19 LTSpostace 2022-05-12
#2楼
得票数 11

看来可以通过在pom.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>
        <!--                    <release>16</release>-->
        <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>
        <!--for unmappable characters in classes-->
        <encoding>UTF-8</encoding>
        <showDeprecation>true</showDeprecation>
        <showWarnings>true</showWarnings>
        <!--for lombok annotations to resolve-->
        <!--contradictory to maven, intelliJ fails with this-->
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

来自Lombok's access to jdk.compiler's internal packages incompatible with Java-16

Jiangyun Wang 提问于2021-03-30
Starl1ght 修改于2021-09-24
我尝试实现此操作,但收到以下错误:java: invalid source release 15 with --enable-preview (preview language features are only supported for release 16) 然后我尝试使用版本 16,但收到原始错误。Dainank 2021-03-30
#3楼
得票数 5

@FrankyFred 提供了一个能够使用 Lombok 的临时解决方案:https://stackoverflow.com/a/66981165/12586904


就我的研究以及我收到的对此问题的各种答复而言,目前在 OpenJDK 16 中似乎没有可能运行 Lombok。因此,使用 Lombok 的替代方法是将 @data 方法手动放入代码中。以下链接简要介绍了如何执行此操作(如果您不熟悉此主题): https://javabydeveloper.com/lombok-data-annotation/#:~:text=Lombok%20Data%20annotation%20(%20%40Data%20),as%20well%20as%20a%20constructor.

表示 @Data 真正含义的伪代码示例:

@Getter @Setter 
@RequiredArgsConstructor
@ToString 
@EqualsAndHashCode
public class User1 {
  private Long id;
  private String username;
  
}

当您需要生成上述所有七个要求时,Lombok @Data 注释可以最大限度地减少更多注释的使用,但是它们在运行代码时本质上实现了相同的目标。

我绝不是这方面的专家,但希望这能帮助那些在使用 Lombok 时遇到困难但需要找到替代方案的人,因为他们的书/教程可能会使用它,而你仍然愿意继续阅读本书/教程。

Dainank 提问于2021-03-27
Dainank 修改于2021-04-07