【发布时间】:2021-03-30 11:37:19
【问题描述】:
只需将我的一个项目从 Java-15 升级到 16(使用最新版本 here)。在编译使用 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 in comments 提供的链接确实与 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>
【问题讨论】:
-
看起来还有一个未解决的问题:github.com/rzwitserloot/lombok/issues/2681 似乎需要超过 1 个附加打开。
-
查看 maven
-X输出,在运行注释处理器时,它没有将所需的标志添加到命令行。 (请注意,您还需要在标志前面使用-J,以便将其传递给 javac 进程本身)。如果我采用 mavens 命令,并手动将缺少的-J--add-opens添加到它,它就可以工作。 -
好吧,既然问题现在已经结束,我将在此处发布:在将
<fork>true</fork>添加到编译器插件配置并添加一个缺少的-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED后,能够使其工作。跨度> -
我认为不包含确切错误的日志是使用 fork=true 的结果。手动运行 javac 时,我看到了更清晰的异常。 maven 文档提示需要 fork=true:maven.apache.org/plugins/maven-compiler-plugin/… "
<compilerArgs>如果fork设置为true,则设置要传递给编译器的参数"。如果问题被重新打开,我也会在这里发布我使用的配置。 -
@JornVernee 问题重新打开
标签: java maven lombok incompatibility java-16