Kapt 无法与 OpenJDK 16 一起正常工作
Posted
技术标签:
【中文标题】Kapt 无法与 OpenJDK 16 一起正常工作【英文标题】:Kapt is not working properly with OpenJDK 16 【发布时间】:2021-08-03 03:20:13 【问题描述】:我有一个将 Kotlin 1.5.0 和 Kapt 用于 mapstruct 的应用程序。我已将我的 JDK 更新为 16,但出现以下编译错误:
Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.5.0:kapt (kapt) on project X: Compilation failure
java.lang.IllegalAccessError: class org.jetbrains.kotlin.kapt3.base.KaptContext (in unnamed module @0x248e24b) cannot access class com.sun.tools.javac.util.Context (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.util to unnamed module @0x248e24b
at org.jetbrains.kotlin.kapt3.base.KaptContext.<init>(KaptContext.kt:29)
at org.jetbrains.kotlin.kapt3.KaptContextForStubGeneration.<init>(KaptContextForStubGeneration.kt:40)
at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.contextForStubGeneration(Kapt3Extension.kt:285)
at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:169)
at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:100)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$invokeExtensionsOnAnalysisComplete(TopDownAnalyzerFacadeForJVM.kt:111)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:121)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:85)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:514)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:505)
at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:112)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:505)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:189)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:155)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:169)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:88)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execCompiler(KotlinCompileMojoBase.java:228)
at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execCompiler(K2JVMCompileMojo.java:237)
at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:152)
at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:44)
at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execute(KotlinCompileMojoBase.java:209)
at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execute(K2JVMCompileMojo.java:222)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
我发现 Kapt 和 JDK 16 存在一个未解决的问题:https://youtrack.jetbrains.com/issue/KT-45545,我正在尝试使用 --add-opens 作为 kotlin-maven-plugin 中的 args 选项但似乎它们无法正常工作:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<executions>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>$mapstruct.version</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
<arg>-X--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
</args>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>$kotlin.version</version>
</dependency>
</dependencies>
</plugin>
当我使用这个 args 选项再次执行 maven 时,会告诉我以下信息:
[INFO] --- kotlin-maven-plugin:1.5.0:kapt (kapt) @ X ---
[WARNING] Source root doesn't exist: /home/nico/IdeaProjects/X/X/src/main/java
[WARNING] 'tools.jar' was not found, kapt may work unreliably
[INFO] Applied plugin: 'spring'
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
[WARNING] Flag is not supported by this version of the compiler: -X--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED
如何将这些选项添加到 kotlin-maven-plugin?
是否有其他方法可以使用 JDK 16 和 maven 运行 Kapt?
【问题讨论】:
【参考方案1】:据 JetBrains comment:
将org.gradle.jvmargs=--illegal-access=permit
添加到gradle.properties
选项可以通过空格分隔来组合:
org.gradle.jvmargs=-Xmx1536m --illegal-access=permit
【讨论】:
我的gradle.properties
已经包含org.gradle.jvmargs=-Xmx1536m
。如何结合这两个选项?
@rmtheis 您可以组合用空格分隔的选项:org.gradle.jvmargs=-Xmx1536m --illegal-access=permit【参考方案2】:
如何将这些选项添加到 kotlin-maven-plugin?
不幸的是,你不能。 kotlin-maven-plugin
不接受 JVM 参数。
是否有任何其他可能使用 JDK 16 和 maven 运行 Kapt?
帮助我的是在我的项目中创建了一个 .mvn/jvm.config 文件,其内容如下:
--illegal-access=permit --add-opens jdk.compiler/com.sun.tools.javac.util=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.jvm=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
当我在命令行中构建项目时它可以正常工作,但请记住,当您使用 IDE 工具管理 Maven 构建时它可能无法正常工作,例如 IntelliJ completely ignores the file。
【讨论】:
【参考方案3】:Now I still not found solution for JDK 16
但我可以使用 JDK 15 来解决问题,您可以在以下位置下载:https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html
【讨论】:
我宁愿使用 JDK 16,因为我在我的服务器中使用它,所以不能降级到 JDK 15。 不幸的是,这是唯一的长期解决方案,因为在 JDK17 上 kapt 无法以任何方式运行。但是,只有 BUILD 需要在 JDK15(最佳)或更早版本上完成。然后可以部署构建结果以在 JDK17 和更高版本上运行。以上是关于Kapt 无法与 OpenJDK 16 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Django TemplateSyntaxError: current transaction is aborted,这个异常是啥意思? postgresql 8.4 可以与 django 一起正常工
如何将 PreferenceFragment 与 ViewPager 一起使用?