【问题标题】:java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment [duplicate]java.lang.IllegalAccessError:类 lombok.javac.apt.LombokProcessor 无法访问类 com.sun.tools.javac.processing.JavacProcessingEnvironment [重复]
【发布时间】:2021-06-22 08:33:33
【问题描述】:

我对编码有点陌生,我正在尝试使用 Lombok 插件来自动创建 Getters/Setters 等。对于我的特定类别的领域。在这样做时,我收到以下错误:

错误:

java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (在未命名的模块@0x3b67ef9b) 不能访问类 com.sun.tools.javac.processing.JavacProcessingEnvironment (在模块 jdk.compiler) 因为模块 jdk .compiler 不会将 com.sun.tools.javac.processing 导出到未命名模块 @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>

【问题讨论】:

  • 如果你在 JDK16 为什么不使用记录?如果您是初学者,为什么不使用基础知识来学习它们的工作原理?众所周知,Lombok 在 JDK16 上的已发布版本中无法正常工作...因此您必须等待更新的版本可用或仅使用普通 java ...(IDE 可以在这里提供很多帮助...) ....
  • 顺便说一句:你能告诉你在哪里找到的:.. is related to an issue in OpenJDK 15..?
  • @khmarbaise 我认为这是 OpenJDK 15 的问题,因为这篇文章表明在 OpenJDK 16 的发布版本中问题将不再存在:github.com/rzwitserloot/lombok/issues/… 但回头看,我认为他只是指 OpenJDK 16 的 beta 版本?
  • 是的,JDK16 已经关闭了之前一直打开的东西(JDK 中的内部东西),这些东西正在被 Lombok 等使用,并且很长一段时间内很明显,关闭将会发生...... .
  • @khmarbaise 作为提醒,我选择删除 Lombok 依赖项,而是制作了我的 Getter、Setter 等。手动在代码中。之后让我的应用程序成功运行。

标签: java spring maven lombok intellij-lombok-plugin


【解决方案1】:

至少切换到包含the fix1.18.22 Lombok 版本

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

要查看最新版本的龙目岛,请点击search.maven.org上的此链接

【讨论】:

  • 我仍然收到此版本 (1.18.20) 和 Java 16 的错误。当我降级到 Java 15 时它消失了。
  • 为我工作,我使用的是 Java 16
  • 这在 Java 17 中对我有用 .. 谢谢。
  • openjdk 11 下的 Woks
  • 这在 Java 17 中对我有用
【解决方案2】:

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


就我的研究以及我收到的对此问题的各种回复而言,似乎 目前在 OpenJDK 中无法运行 Lombok 16。因此,使用 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 时遇到困难但需要找到替代方法的人,因为他们的书/教程可能会使用它,而你会还是想继续看书/教程。

【讨论】:

    【解决方案3】:

    好像可以在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的解决方案

    【讨论】:

    • 我试图实现这一点,但收到以下错误:java: invalid source release 15 with --enable-preview (preview language features are only supported for release 16) 然后我尝试使用版本 16,但收到原始错误。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多