我想在我的项目建设过程中使用3d党库。库方法需要ScriptEngine。当我尝试示例化它时,我得到了一个错误:
java.lang.IllegalArgumentException: Unable to construct script definition: Unable to load base class kotlin.script.experimental.api.KotlinType@42842bb8
at kotlin.script.experimental.host.ConfigurationFromTemplateKt.getTemplateClass(configurationFromTemplate.kt:189)
at kotlin.script.experimental.host.ConfigurationFromTemplateKt.createScriptDefinitionFromTemplate(configurationFromTemplate.kt:36)
at kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory.<init>(KotlinJsr223DefaultScriptEngineFactory.kt:74)
at ce.domain.usecase.load.LoadMetaFilesForTargetUseCase.invoke(LoadMetaFilesUseCase.kt:17)
at ce.domain.usecase.entry.BuildProjectUseCase.invoke(BuildProjectUseCase.kt:24)
at ce.domain.usecase.entry.BuildProjectUseCase.invoke$default(BuildProjectUseCase.kt:18)
at Build_gradle$$$result$1.invoke(build.gradle.kts:68)
at Build_gradle$$$result$1.invoke(build.gradle.kts:60)
at org.gradle.kotlin.dsl.ProjectExtensionsKt$sam$org_gradle_api_Action$0.execute(ProjectExtensions.kt)
at org.gradle.api.internal.tasks.DefaultTaskContainer.create(DefaultTaskContainer.java:368)
at org.gradle.kotlin.dsl.ProjectExtensionsKt.task(ProjectExtensions.kt:147)
at Build_gradle.<init>(build.gradle.kts:60)
...
我复制了简单的grdale项目的问题:示例项目等级:
import kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory
plugins {
kotlin("jvm") version "1.8.21"
application
}
repositories {
mavenCentral()
}
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-scripting-jsr223:1.8.10")
classpath("org.jetbrains.kotlin:kotlin-scripting-common:1.8.10")
classpath("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.8.10")
classpath("org.jetbrains.kotlin:kotlin-reflect")
}
}
dependencies {
testImplementation(kotlin("test"))
}
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"))
}
KotlinJsr223DefaultScriptEngineFactory().getScriptEngine()总是抛出相同的异常。
1条答案
按热度按时间carvr3hs1#
感谢this issue和linked comment thread中贡献者所做的工作,答案相对简单,即使发现如何做到这一点并不容易!我已经清理了提供的变通方案。
总结:
K2JVMCompiler
生成源代码我建议使用buildSrc convention plugin来设置必要的逻辑。它有助于保持构建脚本更清晰、更具有声明性,并且setup-logic包含在buildSrc中。
Kotlin依赖
首先,确保
K2JVMCompiler
类可用。如果你在一个
build.gradle.kts
中工作,那么这可以通过应用Kotlin插件来实现:或者,如果编写插件/预编译脚本插件,请在项目的
build.gradle.kts
中添加对KotlinGradle插件的依赖。访问
K2JVMCompiler
类需要对kotlin-compiler-embeddable
的编译时依赖。请️注意,在
buildSrc/build.gradle.kts
中添加对KGP的依赖意味着必须删除 * 所有 * 其他KGP版本。运行任务
接下来,让我们创建用于运行
.main.kts
文件的任务。为了运行一个Kotlin脚本,我们需要一些东西:
为了遵循Gradle的最佳实践,跟踪任务的输入和输出文件也很重要(但不是严格要求的)。
(As前面提到过,最好在buildSrc目录中执行此任务,但您也可以将此任务粘贴到常规的
build.gradle.kts
中。(As前面提到过,最好在buildSrc目录中执行此任务,但您也可以将此任务粘贴到常规的
build.gradle.kts
中。编译和运行时依赖
让我们使用一个预编译的约定插件来定义如何获取编译和运行Kotlin脚本所需的依赖项。
我们现在有两个包含必要依赖项的配置。在相同的约定插件中,让我们将这些依赖项添加到 all RunKotlinScript任务中。
创建运行任务
这个约定插件可以应用于项目中的任何脚本:
然后您可以创建一个任务,该任务将被正确配置
并且可以使用Gradle运行