Lombok 对于 jdk.compiler 内部包的访问与 Java-16 不兼容。

88

我只是将我的一个项目从Java-15升级到16(使用最新版本的这里)。在编译使用lombok库的项目时,出现了以下问题:

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

我有点卡在了堆栈跟踪上

Caused by: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x4e670245) 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 @0x4e670245
    at lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment (LombokProcessor.java:433)
    at lombok.javac.apt.LombokProcessor.init (LombokProcessor.java:92)
    at lombok.core.AnnotationProcessor$JavacDescriptor.want (AnnotationProcessor.java:160)
    at lombok.core.AnnotationProcessor.init (AnnotationProcessor.java:213)
    at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init (AnnotationProcessor.java:64)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init> (JavacProcessingEnvironment.java:702)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next (JavacProcessingEnvironment.java:829)

现在,至少我认为我知道一个方法来解决这个问题,但是即使尝试以下配置在maven-compiler-plugin上,仍然无法解决。

<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>-->
        <compilerArgs>
            <arg>--enable-preview</arg>
            <arg>-Xlint:all</arg>
            <arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=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>

有人能解决或摆脱这个问题吗?

编辑: 评论中Jorn提供的链接确实与GitHub上的同一问题有关,但是所提出的解决方案仍然不起作用。因此我也添加了以下参数:

<arg>--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>

2
看起来这个问题也有一个开放的问题:https://github.com/rzwitserloot/lombok/issues/2681 似乎需要不止一个add-opens。 - Jorn Vernee
2
查看Maven的-X输出,发现在运行注解处理器时,它没有将所需的标志添加到命令行中。(请注意,您还需要在标志前面加上-J,以便将其传递给javac进程本身)。如果我手动将缺失的-J--add-opens添加到Maven的命令中,则可以正常工作。 - Jorn Vernee
3
既然这个问题现在已经关闭,我会在这里发布我的答案:在编译器插件配置中添加<fork>true</fork>并添加一个缺少的 -J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED 后,我成功让它运行。 - Jorn Vernee
4
我认为不包含确切错误信息的日志是使用fork=true时的结果。当我手动运行javac时,我看到了更清晰的异常信息。Maven文档提示需要使用fork=true:https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs "<compilerArgs>如果fork设置为true,则设置要传递给编译器的参数"。如果问题重新开放,我也会在这里发布我使用的配置。 - Jorn Vernee
1
@JornVernee的问题已重新开放。 - Fenio
显示剩余4条评论
12个回答

0
我发现需要设置我的JAVA_HOME变量。如果你不知道它是什么,可以运行此命令来查找它。
java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home'

并将值设置在您的RC文件中为JAVA_HOME。


0

我需要从pom.xml中删除这个内容,以便项目能够成功构建和启动,并仅使用lombok依赖。

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
                <generatedSourcesDirectory>${project.build.directory}/generated-sources/</generatedSourcesDirectory>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${version.mapstruct}</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${version.lombok}</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok-mapstruct-binding</artifactId>
                        <version>${version.mapstruct-lombok}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接