首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lombok对jdk.编译器内部包的访问与Java-16不兼容

Lombok对jdk.编译器内部包的访问与Java-16不兼容
EN

Stack Overflow用户
提问于 2020-12-20 13:23:51
回答 10查看 76.8K关注 0票数 68

只需将我的一个项目从Java-15升级到16个(使用最新的构建这里)。在编译使用lombok的项目时,例如:

代码语言:javascript
复制
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
</dependency>

我有点被堆栈跟踪卡住了

代码语言:javascript
复制
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上尝试下面的配置时也是如此。

代码语言:javascript
复制
<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上的相同问题有关,但所提出的解决方案仍然不起作用。因此,我还添加了以下args:

代码语言:javascript
复制
<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>
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2020-12-20 16:23:15

更新

Lombok v1.18.20支持JDK 16开箱即用

在同一个线程中,维护者之一也是写入

我们有一些不太为人所知的漏洞,我们可以利用这些漏洞来弥补一些差距。我们将同时开始研究gradle和maven插件,这将是一个长期的修复。

原始

您看到的最新JDK-16版本的例外是因为JEP 396:默认情况下强封装JDK内部。Lombok正在使用反射访问内部JDK,而在以前的Java版本中,这将导致警告消息,现在则会导致严重错误。

通常,通过在运行--add-opens=<module>/<package>=<accessing module>时将java指令作为VM参数传递,可以显式地打开内部JDK包,以便在运行java时进行反射。在这种情况下,这些指令需要传递给在调用java时运行的javac进程。这可以通过在传递给javac的选项加上-J前缀来实现,而后者将把它传递给底层JVM。

使用Maven,我能够使它与以下编译器插件配置一起工作:

代码语言:javascript
复制
<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,以便将它们传递给运行javac的JVM,而不是javac选项。

在问题中列出的--add-opens指令之外,还有一个附加的:

代码语言:javascript
复制
-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED

也是需要的。

还需要<fork>true</fork>,因为否则-J选项就会被忽略(从mvn clean install -X的输出来判断)。查看Maven文档,在使用fork时,似乎随时需要将<compilerArgs>设置为<compilerArgs>

https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs

如果将<compilerArgs>设置为true,则fork设置要传递给编译器的参数。

票数 91
EN

Stack Overflow用户

发布于 2021-11-02 12:02:42

将lombok版本升级为1.18.20,为我修复了它。因此,如果您可以升级lombok,我建议您这样做。

代码语言:javascript
复制
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>
票数 17
EN

Stack Overflow用户

发布于 2022-01-31 11:51:16

对于使用Java11或任何与最新版本不同的版本的用户,请记住,IntelliJ可以使用自己的Maven版本连接到JDK 16/17,从而导致在从IntelliJ终端执行mvn clean install时出现上述错误。

要检查实际使用的JDK,在终端中键入mvn --version,您可能会像我一样得到一个惊喜(我甚至不知道我有JDK 17):

代码语言:javascript
复制
Maven home: /usr/local/Cellar/maven/3.8.4/libexec
Java version: 17.0.1, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/17.0.1_1/libexec/openjdk.jdk/Contents/Home
Default locale: en_BG, platform encoding: UTF-8
OS name: "mac os x", version: "11.3.1", arch: "x86_64", family: "mac"

同时,我在检查java --version时得到了Java11。

这里的解决方案是通过Maven选项卡右边的Maven目标按钮执行mvn clean install

它正确地使用了JDK 11,这也可以通过mvn --version进行验证。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65380359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档