Nam*_*man 31 java incompatibility maven lombok java-16
只需将我的一个项目从 Java-15 升级到 16(使用此处的最新版本)。在编译使用 lombok 的项目时,例如:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我有点被堆栈跟踪卡住了
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)
Run Code Online (Sandbox Code Playgroud)
现在,至少我认为我知道解决这个问题的技巧,但即使在尝试以下配置时 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>
Run Code Online (Sandbox Code Playgroud)
有没有人能够解决或摆脱这个?
编辑: 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>
Run Code Online (Sandbox Code Playgroud)
Jor*_*nee 48
更新:
Lombok v1.18.20 支持 JDK 16 开箱即用。
在同一线程中,其中一位维护者还写道:
我们有一些鲜为人知的漏洞,可以用来弥补一些差距。同时,我们将开始研究 gradle 和 maven 插件,这将是一个长期修复。
您在最新的 JDK-16 版本中看到的例外是因为JEP 396: Strongly Encapsulate JDK Internals by Default。Lombok 正在使用反射访问内部 JDK API,在以前的 Java 版本中,这会导致警告消息,现在会导致硬错误。
通常,通过--add-opens=<module>/<package>=<accessing module>在运行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>
Run Code Online (Sandbox Code Playgroud)
使用<compilerArgs>配置中的元素传递所需选项的位置。
请注意,我-J在选项前面添加了为了将它们传递给正在运行的 JVM javac,而不是javac选项。
在--add-opens问题中列出的指令之上,还有一个:
-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)
也需要。
<fork>true</fork>还需要,因为否则-J选项将被忽略(从 的输出判断mvn clean install -X)。查看 Maven 文档,在使用时似乎随时都需要设置fork为:true<compilerArgs>
https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs
<compilerArgs>如果fork设置为 ,则设置要传递给编译器的参数true。
pra*_*ush 39
升级 Lombok 版本来1.18.20修复它。因此,如果您可以升级 Lombok,我建议您这样做。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Pet*_*ski 20
For those of you using Java 11 or any different one from the newest versions, keep in mind that IntelliJ can use its own Maven version hooked to JDK 16/17, thereby causing the error above when doing mvn clean install from the IntelliJ terminal.
To check the actual JDK used, type mvn --version in the terminal, and you might get a surprise like I did (I didn't even know I had JDK 17):
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"
Run Code Online (Sandbox Code Playgroud)
At the same time, I get Java 11 when checking java --version.
The solution here was to execute mvn clean install via the Maven Goal button in the Maven tab to the right:
它正确使用了 JDK 11,也可以通过以下方式验证mvn --version.
对于使用 的用户Gradle,要正确配置 Lombok,请在文件中使用compileOnly和。annotationProcessor build.gradle
// Lombok
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
Run Code Online (Sandbox Code Playgroud)
test dependencies如果您也在那里使用 Lombok,则相同:
testCompileOnly 'org.projectlombok:lombok:1.18.20'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
Run Code Online (Sandbox Code Playgroud)
另外,如果您想显式生成字节码目标JDK 16,请使用:
sourceCompatibility = '16'
targetCompatibility = '16'
Run Code Online (Sandbox Code Playgroud)
来源:
设置Lombok和Gradle
Gradle sourceCompatibility和targetCompatibility
小智 5
如果您使用 macos 和 jenv,出现此问题的原因是环境变量 JAVA_HOME 未激活\xef\xbc\x8c 只需执行以下操作\xef\xbc\x9a
\njenv enable-plugin export\nRun Code Online (Sandbox Code Playgroud)\n然后重新打开终端会话并输入echo $JAVA_HOME
| 归档时间: |
|
| 查看次数: |
19858 次 |
| 最近记录: |