微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor 无法访问 class com.sun.tools.javac.processing.JavacProcessingEnvironment 使用@Data 的类龙目岛:我的 Pom 文件:

如何解决java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor 无法访问 class com.sun.tools.javac.processing.JavacProcessingEnvironment 使用@Data 的类龙目岛:我的 Pom 文件:

我对编码有点陌生,正在尝试使用 Lombok 插件自动创建 Getter/Setter 等。对于我的特定课程的领域。这样做时,我收到了以下错误

错误

java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x3b67ef9b) 无法访问 class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) 因为模块 jdk .compiler 不会将 com.sun.tools.javac.processing 导出到未命名的模块 @0x3b67ef9b

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

这个线程声称有一个解决方案:https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-748616687 但在实现插件后,它似乎没有任何区别,我仍然收到错误

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

使用@Data 的类(龙目岛):

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>

解决方法

至少切换到包含 the fix 的 Lombok 的 .details-description 版本

1.18.20
,

@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 时陷入困境但需要找到替代方案的人,因为他们的书/教程可能会使用它,而你会还是喜欢继续看这本书/教程。

,

似乎可以通过在pox.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的解决方案

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。