如何从 Kotlin/Java 中 运行 Kotlin-Script (.kts) 文件?

How can I run Kotlin-Script (.kts) files from within Kotlin/Java?

我注意到 IntelliJ 可以将 .kts 文件解析为 Kotlin,并且代码编辑器将它们作为自由浮动的 Kotlin 文件进行挑选。您还可以 运行 IntelliJ 中的脚本,就像使用 main 方法的 Kotlin 文件一样。脚本从上到下执行。

如果我知道在 Java 或 Kotlin 中使用它们的简单方法,此表格非常适合我正在从事的项目。

"run" 这些来自 Java 或 Kotlin 的脚本的惯用方法是什么?

请注意,Kotlin 中的脚本文件支持仍处于试验阶段。这是一个未记录的功能,我们仍在设计过程中。今天的工作明天可能会改变、中断或消失。

也就是说,目前有两种调用脚本的方法。您可以使用命令行编译器:

kotlinc -script foo.kts <args>

或者您可以直接从 IntelliJ IDEA 调用脚本,方法是 right-clicking 在编辑器中或在 .kts 文件的项目视图中选择 "Run ...":

KtsRunner

我发布了一个简单的库,让您可以 运行 来自常规 Kotlin 程序的脚本。

https://github.com/s1monw1/KtsRunner

例子

  1. 例子class

    data class ClassFromScript(val x: String)
    
  2. .kts 文件

    import de.swirtz.ktsrunner.objectloader.ClassFromScript
    
    ClassFromScript("I was created in kts")
    
  3. 代码加载 class

    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 class 可用于执行 .kts 脚本和 return 其结果。该示例显示了一个脚本,它创建了一个 ClassFromScript 类型的实例,该实例通过 KtsObjectLoader 加载,然后在常规程序中处理。

2020 年初 kscript that you find at https://github.com/holgerbrandl/kscript 似乎是最方便和最受支持的方式......

截至 2020 年 (Kotlin 1.3.70),您可以直接使用

kotlin script.main.kts

请注意,使用文件扩展名 .main.kts 而不是 .kts

请注意,对我而言,不是 运行 如果定义了 main() 函数,我必须添加对 [=13 的手动调用=] 在顶层。

Kotlin 脚本的优点之一是能够在单个文件中声明代码和依赖项(使用 @file:DependsOn,参见示例