lombok对jdk.compiler内部包的访问与java-16不兼容

13z8s7eq  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(1275)

只需将我的一个项目从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 ```

org.apache.maven.plugins
maven-compiler-plugin
3.8.1

16
16


--enable-preview
-Xlint:all
--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED


UTF-8
true
true




org.projectlombok
lombok
1.18.16



有人能解决这个问题吗?
编辑:jorn在评论中提供的链接确实与github上的相同问题有关,但提出的解决方案仍然不起作用。因此,我还添加了以下参数:

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

bq9c1y66

bq9c1y661#

最新的jdk-16版本中出现的一个例外是因为jep396:默认情况下强封装jdk内部构件。lombok正在使用反射访问一个内部jdkapi,在以前的java版本中,这会导致一条警告消息,而现在会导致一个硬错误。
通常,在通过传递运行java时,可以显式地打开内部jdk包进行反射 --add-opens=<module>/<package>=<accessing module> 运行时作为vm参数的指令 java . 在这种情况下,这些指令需要传递给 java 调用时运行的进程 javac . 这可以通过在传递给的选项前面加前缀来实现 javac-J ,它将把它传递给底层jvm。
使用maven,我可以使用以下编译器插件配置:

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

其中所需的选项通过 <compilerArgs> 配置中的元素。
注意,我添加了 -J 在选项前面,以便将它们传递给正在运行的jvm javac ,而不是 javac 选项。
在屋顶上 --add-opens 问题中列出的指令,附加:

-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED

也需要。 <fork>true</fork> 也需要,否则 -J 选项被忽略了(从 mvn clean install -X ). 看看maven文档,设置 forktrue 使用时似乎随时需要 <compilerArgs> :
https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerargs <compilerArgs> 设置要传递给编译器的参数,如果 fork 设置为 true .

相关问题