Kotlin项目kaptGenerateStubsKotlin任务间歇性构建失败求助
自研Kotlin项目Kapt构建非确定性失败问题
问题背景
维护自研Kotlin项目时遭遇棘手问题:项目采用依赖Kapt生成代码的EBean框架,但每隔几天执行./gradlew run构建时,:kaptGenerateStubsKotlin任务就会失败。每次失败后升级Kotlin版本可临时解决问题,过去一年已重复至少10次,困扰极大。核心疑问:版本已固定,构建间隔期间未手动更新任何内容,为何构建结果非确定性?
错误日志
> Task :kaptGenerateStubsKotlin FAILED e: java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @0x65012184) cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module @0x65012184 at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1018) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524) at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427) at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) at org.jetbrains.kotlin.kapt3.base.KaptContext.<init>(KaptContext.kt:55) at org.jetbrains.kotlin.kapt3.KaptContextForStubGeneration.<init>(KaptContextForStubGeneration.kt:38) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.contextForStubGeneration(Kapt3Extension.kt:278) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:157) at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:87) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$invokeExtensionsOnAnalysisComplete(TopDownAnalyzerFacadeForJVM.kt:104) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:114) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:77) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:256) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:247) at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:247) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:87) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:43) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:165) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:50) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:104) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:48) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:463) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:62) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:477) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:400) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:281) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:125) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:657) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:105) at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1624) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':kaptGenerateStubsKotlin'. > A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction > Internal compiler error. See log for more details * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See https://docs.gradle.org/7.5/userguide/command_line_interface.html#sec:command_line_warnings BUILD FAILED in 1s
当前环境参数
Java版本
java -version java version "17.0.10" 2024-01-16 LTS Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240) Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)
Gradle版本
./gradlew -version ✔ base ------------------------------------------------------------ Gradle 7.5 ------------------------------------------------------------ Build time: 2022-07-14 12:48:15 UTC Revision: c7db7b958189ad2b0c1472b6fe663e6d654a5103 Kotlin: 1.6.21 Groovy: 3.0.10 Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021 JVM: 17.0.10 (Oracle Corporation 17.0.10+11-LTS-240) OS: Mac OS X 13.2.1 aarch64
build.gradle关键配置
Plugins配置
plugins { id 'org.jetbrains.kotlin.jvm' version '1.9.20' id "org.jetbrains.kotlin.kapt" version "1.9.20" id 'com.github.ben-manes.versions' version '0.28.0' id 'io.gitlab.arturbosch.detekt' version '1.22.0' id('io.ebean') version '13.11.0' id "com.google.protobuf" version "0.9.1" } apply plugin: 'java' apply plugin: 'application' apply plugin: 'jacoco'
Dependencies配置
dependencies { // query bean generation kapt 'io.ebean:kotlin-querybean-generator:13.11.0' implementation 'io.ebean:ebean:13.11.0' implementation 'io.ebean:ebean-migration:13.6.0' implementation 'io.ebean:ebean-querybean:13.11.0' testImplementation 'io.ebean:ebean-test:13.11.0' } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { kotlinOptions { jvmTarget = "17" } }
问题分析与解决方案
核心原因
- 版本兼容性冲突:Gradle 7.5自带的Kotlin版本为1.6.21,但手动指定了Kotlin插件版本1.9.20,两者版本差异过大,Gradle对高版本Kotlin的兼容性不足,导致构建过程中出现模块访问权限异常。
- 增量构建缓存损坏:Kapt的增量构建缓存可能因版本不兼容、JDK模块系统限制等原因出现状态不一致,导致非确定性构建失败,升级Kotlin版本会清理部分缓存,因此能临时解决。
- JDK模块系统限制:Java 17的模块系统默认不对外暴露
com.sun.tools.javac.main包,Kapt的内部类试图访问该包时触发权限错误。
具体解决方案
清理构建缓存(临时应急)
执行./gradlew clean清理所有构建缓存,再重新执行构建,无需升级Kotlin版本即可验证是否解决问题。统一版本兼容性
- 方案一:降级Kotlin版本到Gradle 7.5支持的最高稳定版(1.7.20),修改plugins中的Kotlin版本:
id 'org.jetbrains.kotlin.jvm' version '1.7.20' id "org.jetbrains.kotlin.kapt" version "1.7.20" - 方案二:升级Gradle到8.x版本(推荐8.5+),Gradle 8.x原生支持Kotlin 1.9.x,彻底解决版本兼容问题。
- 方案一:降级Kotlin版本到Gradle 7.5支持的最高稳定版(1.7.20),修改plugins中的Kotlin版本:
绕过JDK模块访问限制
在gradle.properties文件中添加以下JVM参数,强制开放JDK内部模块的访问权限:org.gradle.jvmargs=--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED检查EBean版本兼容性
确保EBean 13.11.0与使用的Kotlin版本匹配,确认EBean官方支持的Kotlin版本范围,避免依赖不兼容。禁用增量构建(兜底方案)
在gradle.properties中添加以下配置,彻底关闭Kotlin增量构建,避免缓存问题:kotlin.incremental=false
内容的提问来源于stack exchange,提问作者Stanislav Kozlovski
相关产品推荐
相关产品推荐

