我注意到IntelliJ可以将.kts
文件解析为Kotlin代码,并且代码编辑器将它们识别为自由漂浮的Kotlin文件。您也可以像运行带有main方法的Kotlin文件一样在IntelliJ中运行脚本。该脚本按照从上到下的顺序执行。
如果我知道一种简单的方法可以从Java或Kotlin中使用它们,那么这种形式对我正在开发的项目来说是完美的。
什么是运行这些脚本的惯用方式?从Java或Kotlin中运行这些脚本的方法是什么?
我注意到IntelliJ可以将.kts
文件解析为Kotlin代码,并且代码编辑器将它们识别为自由漂浮的Kotlin文件。您也可以像运行带有main方法的Kotlin文件一样在IntelliJ中运行脚本。该脚本按照从上到下的顺序执行。
如果我知道一种简单的方法可以从Java或Kotlin中使用它们,那么这种形式对我正在开发的项目来说是完美的。
什么是运行这些脚本的惯用方式?从Java或Kotlin中运行这些脚本的方法是什么?
我发布了一个简单的库,可以让你从常规的 Kotlin 程序中运行脚本。
https://github.com/s1monw1/KtsRunner
示例类:
data class ClassFromScript(val x: String)
.kts
文件
import de.swirtz.ktsrunner.objectloader.ClassFromScript
ClassFromScript("I was created in kts")
加载该类的代码
val scriptReader = Files.newBufferedReader(Paths.get("path/classDeclaration.kts"))
val loadedObj: ClassFromScript = KtsObjectLoader().load<ClassFromScript>(scriptReader)
println(loadedObj.x) // >> I was created in kts
如上所示,KtsObjectLoader
类可用于执行一个 .kts
脚本并返回其结果。该示例演示了一个脚本,该脚本创建了一个 ClassFromScript
类的实例,该类通过 KtsObjectLoader
加载,然后在常规程序中进行处理。
kotlin script.main.kts
.main.kts
而不是.kts
似乎很重要。main()
函数,似乎无法运行它,我必须在顶层添加手动调用main()
。@file:DependsOn
,例如这里)。.main.kts
文件中的代码实际上嵌入在文件外定义的 main 函数内(可能来自隐式的 kotlin-main-kts
依赖项?)。因此,总是定义了一个 main 函数,只是你看不到它。这很有道理,因为它旨在成为一个脚本。如果你可以定义自己的 main 函数,那么它将成为一个可执行程序,而不是一个脚本,我想。 - tjalling.myownthing.kts
文件,并确定隐含范围和执行方式。例如,如果您已经创建了基于 Kotlin 的 DSL,则 .myownthing.kts
运行器可以确保该 DSL 的编译时和运行时依赖项始终存在于 .myownthing.kts
文件中,以便用户可以直接在其脚本中使用您的 DSL。至少这是我的理解,我自己还没有尝试过。 - tjallingjgo可以从Maven存储库获取并运行代码,因此可以用来调用https://github.com/scijava/scijava-common和https://github.com/scripting-kotlin来执行本地的Foo.kt
,如下所示:
jgo --repository scijava.public=maven.scijava.org/content/groups/public org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-kotlin Foo.kt
Foo.kt
,它将启动 Kotlin REPL。