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

Jir*_*ire 26 java kotlin

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

这个表单对于我正在处理的项目来说是完美的,只要我知道在Java或Kotlin中使用它们的简单方法.

从Java或Kotlin"运行"这些脚本的惯用方法是什么?

Ale*_*lov 27

请注意,Kotlin中的脚本文件支持仍然是实验性的.这是一个未记录的功能,我们仍在设计过程中.今天工作的东西明天可能会改变,破裂或消失.

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

kotlinc -script foo.kts <args>
Run Code Online (Sandbox Code Playgroud)

或者,您可以直接从IntelliJ IDEA调用脚本,方法是右键单击编辑器或在.kts文件的项目视图中选择"运行...":

从IntelliJ IDEA运行.kts

  • 感谢官方负责人.我可能会为这些脚本生成适当的字节码,以便在Java或Kotlin中轻松执行它们. (2认同)

xjc*_*jcl 10

从 2020 年( Kotlin 1.3.70 )开始,您可以使用简单的

kotlin script.main.kts
Run Code Online (Sandbox Code Playgroud)

请注意,使用文件扩展名.main.kts而不是.kts 似乎很重要

请注意,对我来说,如果定义了该函数,这似乎不会运行该main()函数,我必须main()在顶层添加手动调用。

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


s1m*_*nw1 7

KtsRunner

我发布了一个简单的库,让你从常规的Kotlin程序中运行脚本.

https://github.com/s1monw1/KtsRunner

  1. 示例类

    data class ClassFromScript(val x: String)
    
    Run Code Online (Sandbox Code Playgroud)
  2. .kts文件

    import de.swirtz.ktsrunner.objectloader.ClassFromScript
    
    ClassFromScript("I was created in kts")
    
    Run Code Online (Sandbox Code Playgroud)
  3. 加载类的代码

    val scriptReader =  Files.newBufferedReader(Paths.get("path/classDeclaration.kts"))
    val loadedObj: ClassFromScript = KtsObjectLoader().load<ClassFromScript>(scriptReader)
    println(loadedObj.x) // >> I was created in kts
    
    Run Code Online (Sandbox Code Playgroud)

如图所示,KtsObjectLoader该类可用于执行.kts脚本并返回其结果.该示例显示了一个脚本,该脚本创建ClassFromScript通过KtsObjectLoader常规程序加载然后处理的类型的实例.


Dir*_*ann 5

2020 年初,您在https://github.com/holgerbrandl/kscript找到的kscript 似乎是最方便且支持良好的方式......