使用Arrow Analysis抛出NoSuchMethod异常,是否需特定JVM/Kotlin版本?
问题描述
尝试使用Arrow Analysis实现编译时异常捕获,按官方文档操作后,执行Gradle构建时抛出大量运行时异常。
测试代码
fun main() { val wrong = emptyList<Int>().get(2) }
Gradle构建脚本
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.7.10" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation("io.arrow-kt:arrow-core:1.1.2") } buildscript { dependencies { classpath("io.arrow-kt.analysis.kotlin:io.arrow-kt.analysis.kotlin.gradle.plugin:2.0") } } apply(plugin = "io.arrow-kt.analysis.kotlin") tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
构建错误日志
java.lang.NoSuchMethodError: 'org.jetbrains.kotlin.psi.KtExpression org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt.getReceiverExpression(org.jetbrains.kotlin.resolve.calls.model.ResolvedCall)' at arrow.meta.plugins.analysis.phases.analysis.solver.ast.kotlin.KotlinResolvedCall.getReceiverExpression(KotlinResolvedCall.kt:37) at arrow.meta.plugins.analysis.phases.analysis.solver.ResolvedCallUtilsKt.allArgumentExpressions(ResolvedCallUtils.kt:75) at arrow.meta.plugins.analysis.phases.analysis.solver.ResolvedCallUtilsKt.arg(ResolvedCallUtils.kt:119) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt.controlFlowAnyFunction(Expressions.kt:438) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt.checkCallExpression(Expressions.kt:397) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt.fallThrough(Expressions.kt:260) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt.access$fallThrough(Expressions.kt:1) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt$checkExpressionConstraints$2.invoke(Expressions.kt:244) at arrow.meta.plugins.analysis.phases.analysis.solver.check.ExpressionsKt$checkExpressionConstraints$2.invoke(Expressions.kt:157) at arrow.meta.continuations.ContSeq$flatMap$1.invokeSuspend(ContSeq.kt:60) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) // 省略后续重复栈跟踪内容 at java.base/java.lang.Thread.run(Thread.java:833)
疑问
使用Arrow Analysis是否需要特定的JVM版本或Kotlin版本?
解决方案
这个NoSuchMethodError本质是Arrow Analysis插件与Kotlin版本不兼容导致的API调用失败,同时JVM版本也有明确要求:
1. Kotlin版本匹配规则
Arrow Analysis插件对Kotlin版本有严格依赖,不同插件版本对应固定的Kotlin版本范围:
- Arrow Analysis 2.0版本要求Kotlin版本为1.8.0及以上,你当前使用的Kotlin 1.7.10不符合要求,这是报错的核心原因。
- 若要保留Kotlin 1.7.x版本,需将Arrow Analysis插件降级到1.4.4,该版本兼容Kotlin 1.7系列。
2. JVM版本要求
- Arrow Analysis 2.x版本要求JDK 11及以上;如果使用JDK 8,必须搭配Arrow Analysis 1.x版本。
- 你的构建脚本中
jvmTarget设为1.8,若运行环境为JDK 11+,该配置可保留,但JDK版本需满足插件要求。
修正后的Gradle配置示例
方案1:升级Kotlin到兼容版本(推荐)
plugins { kotlin("jvm") version "1.8.22" // 升级到Arrow Analysis 2.0兼容的Kotlin版本 } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation("io.arrow-kt:arrow-core:1.1.2") } buildscript { dependencies { classpath("io.arrow-kt.analysis.kotlin:io.arrow-kt.analysis.kotlin.gradle.plugin:2.0") } } apply(plugin = "io.arrow-kt.analysis.kotlin") tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
方案2:降级插件适配现有Kotlin版本
plugins { kotlin("jvm") version "1.7.10" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation("io.arrow-kt:arrow-core:1.1.2") } buildscript { dependencies { classpath("io.arrow-kt.analysis.kotlin:io.arrow-kt.analysis.kotlin.gradle.plugin:1.4.4") // 降级插件版本 } } apply(plugin = "io.arrow-kt.analysis.kotlin") tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
内容的提问来源于stack exchange,提问作者Vencat
相关产品推荐
相关产品推荐

