如何在Gradle KTS中实例化KTS脚本引擎?遇类加载异常
解决KotlinJsr223DefaultScriptEngine实例化异常问题
问题根源
你遇到的IllegalArgumentException核心原因有两点:
- Kotlin版本不匹配:项目使用Kotlin 1.8.21,但scripting相关依赖(如
kotlin-scripting-jsr223)用的是1.8.10,版本不一致导致类加载冲突。 - 依赖未加入任务类路径:你将scripting依赖放在
buildscript的classpath中,但Gradle任务执行时使用的是项目自身的类加载器,无法访问buildscript里的依赖。
解决方案
1. 统一Kotlin版本
将所有Kotlin相关依赖的版本统一为项目使用的1.8.21,避免版本冲突。
2. 调整依赖配置
将scripting相关依赖从buildscript移到项目的dependencies块中,确保任务执行时能访问到这些依赖。
修改后的完整build.gradle.kts
import kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory plugins { kotlin("jvm") version "1.8.21" application } repositories { mavenCentral() google() } dependencies { testImplementation(kotlin("test")) // 添加scripting相关依赖,版本与项目Kotlin一致 implementation("org.jetbrains.kotlin:kotlin-scripting-jsr223:1.8.21") implementation("org.jetbrains.kotlin:kotlin-scripting-common:1.8.21") implementation("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.8.21") implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.21") } abstract class TestProjectTask : DefaultTask() { @get: InputFile abstract val projectFile: RegularFileProperty @TaskAction fun execute() { try { val eng2 = KotlinJsr223DefaultScriptEngineFactory().getScriptEngine() println("Project file = ${projectFile.get()} $eng2") val worker = Worker() worker.doWork(eng2, projectFile.asFile.get().absolutePath) } catch (err: Throwable) { err.printStackTrace() } } } task("hello2", TestProjectTask::class) { projectFile.set(file("./project.kts")) }
额外说明
- 如果
Worker类依赖这些scripting库,确保它所在的模块也能访问到上述依赖。 - 若仍存在类加载问题,可尝试为任务显式指定类路径:
task("hello2", TestProjectTask::class) { projectFile.set(file("./project.kts")) classpath(sourceSets.main.get().runtimeClasspath) }
内容的提问来源于stack exchange,提问作者VShcryabets
相关产品推荐
相关产品推荐

