Windows下执行gradlew损坏缓存触发Kotlin编译NoClassDefFoundError报错
问题描述
- 现有一个编译目标为Java字节码的Kotlin项目,原本通过IntelliJ可以正常构建、运行
- 在Windows系统命令行进入项目根目录执行
gradlew clean或gradlew build命令时,抛出如下错误:
e: java.lang.NoClassDefFoundError: Could not initialize class org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel at org.jetbrains.kotlin.com.intellij.core.CoreLanguageLevelProjectExtension.<init>(CoreLanguageLevelProjectExtension.java:26) at org.jetbrains.kotlin.com.intellij.core.JavaCoreProjectEnvironment.<init>(JavaCoreProjectEnvironment.java:42) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment.<init>(KotlinCoreProjectEnvironment.kt:26) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$ProjectEnvironment.<init>(KotlinCoreEnvironment.kt:121) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(KotlinCoreEnvironment.kt:425) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.createCoreEnvironment(K2JVMCompiler.kt:226) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:152) 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.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:386) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:110) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:286) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl$rebuild(IncrementalCompilerRunner.kt:99) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:114) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:74) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:607) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:96) at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1659) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) 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:712) 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:399) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "RMI TCP Connection(4)-127.0.0.1"] at org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel.<clinit>(LanguageLevel.java:25) at org.jetbrains.kotlin.com.intellij.core.CoreLanguageLevelProjectExtension.<init>(CoreLanguageLevelProjectExtension.java:26) at org.jetbrains.kotlin.com.intellij.core.JavaCoreProjectEnvironment.<init>(JavaCoreProjectEnvironment.java:42) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment.<init>(KotlinCoreProjectEnvironment.kt:26) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$ProjectEnvironment.<init>(KotlinCoreEnvironment.kt:121) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(KotlinCoreEnvironment.kt:425) at org.jetbrains.kotlin.incremental.parsing.ParseFileUtilsKt.classesFqNames(parseFileUtils.kt:46) at org.jetbrains.kotlin.incremental.parsing.ParseFileUtilsKt.classesFqNames(parseFileUtils.kt:35) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.getRemovedClassesChanges(IncrementalCompilerRunner.kt:362) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.calculateSourcesToCompileImpl(IncrementalJvmCompilerRunner.kt:224) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.calculateSourcesToCompileImpl(IncrementalJvmCompilerRunner.kt:169) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.calculateSourcesToCompileImpl(IncrementalJvmCompilerRunner.kt:110) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.calculateSourcesToCompile(IncrementalCompilerRunner.kt:171) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.sourcesToCompile(IncrementalCompilerRunner.kt:163) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:107) ... 19 more
- 触发该报错后,再用IntelliJ构建项目也会出现相同错误,目前仅能通过删除Gradle缓存临时修复
- 曾怀疑问题和JDK版本相关,但多次切换JDK版本后问题仍会复现,无法定位具体根因
根因定位
这个报错本质是Kotlin编译器内嵌的IntelliJ Java语言级别枚举类初始化失败,和手动切换的全局JDK版本没有直接关系,核心触发点有两个:
- Gradle守护进程类加载污染:命令行执行gradle命令时默认复用已经启动的守护进程,一旦旧进程里出现Kotlin编译器jar包版本冲突、类加载异常,后续所有构建都会直接抛这个错。删除Gradle缓存能临时恢复,本质是删缓存的操作会强制杀死旧守护进程、重新拉取依赖,并没有真正解决冲突。
- Kotlin插件版本和运行JDK不兼容:如果项目用的Kotlin Gradle插件版本低于1.7.0,运行在JDK18及以上版本时,会因为识别不了高版本JDK的语言级别标识,直接触发
LanguageLevel类的静态初始化失败。另外Windows下如果系统环境变量里JAVA_TOOL_OPTIONS配置了非常规JVM参数,也可能打断这个类的初始化流程。
修复方案
按顺序尝试,哪步生效就可以停止:
- 先在项目根目录执行
gradlew --stop,把所有现存的Gradle守护进程全部终止,再重新执行构建命令,80%以上的场景这步就能解决问题 - 打开项目根目录的构建配置文件(
build.gradle或build.gradle.kts),将Kotlin Gradle插件版本升级到匹配的稳定版:使用JDK17/19的话至少升级到1.7.20,使用JDK20/21的话至少升级到1.9.0。同时检查gradle.properties里有没有自定义的异常JVM参数,有的话先注释掉 - 打开Windows系统环境变量设置,查找
JAVA_TOOL_OPTIONS、_JAVA_OPTIONS两个变量,把里面和类加载、字节码修改、全局代理相关的自定义参数暂时删除,这类参数会全局注入所有JVM进程,很容易导致编译器初始化失败 - 以上操作都无效的话,先执行
gradlew clean build --no-daemon,关闭守护进程模式做单次构建,如果能正常运行,直接删除用户目录下.gradle/daemon文件夹内所有版本的缓存文件,后续启动新守护进程就不会存在历史污染问题。
内容的提问来源于stack exchange,提问作者cershif
相关产品推荐
相关产品推荐

