如何在 Kotlin 脚本中引入一个 JAR 文件

5

我希望将一些通用代码从我的 Kotlin 脚本文件中分离出来,以便可以重复使用。

我这样做:

// MyLib.kt

package myLib
fun say_hello(name : String)
{
   println("hello $name")
}

我编译这个文件以创建一个jar文件:

kotlinc myLib.kt -include-runtime -d myLib.jar

然后我创建了一个脚本文件:

// myScript.kts

import myLib.*
say_hello("Arvind")

但我无法编译脚本文件,因为它既不识别myLib包,也不识别say_hello()函数。

正确的方法是什么?

问题更新:我正在使用kscript运行我的脚本。要键入很多内容,例如:

kotlin -cp myLib.jar myScript.kts

每次我都需要运行脚本,这就打败了使用 kscript 的初衷。
是否有任何方法,可以不用每次在命令行中给出 jar 文件的路径。相反,我想以 kscript 的方式使用它。
./myScript

我遇到了同样的问题,你使用kotlin命令的解决方案有效。但这意味着kotlin的文档是错误的:https://kotlinlang.org/docs/tutorials/command-line.html 这使用kotlinc编译器来调用脚本,我无法使其加载jar文件的内容。 - shaft
1个回答

2

你需要将myLib.jar包含在classpath中,例如:

kotlin -cp myLib.jar myScript.kts

另外,您不需要使用-include-runtime编译myLib,除非您想创建一个自包含和可运行的jar文件(请参见示例)。

更新:

myScript.kts重命名为myScript.main.kts并更改其内容:

#!/usr/bin/env kotlin

@file:DependsOn("myLib.jar")

import myLib.*

say_hello("Arvind")

现在你可以调用它(不要忘记设置执行权限):

./myScript.main.kts

如果您想包含myLib.kt脚本而不是myLib.jar文件,请将@file:DependsOn("myLib.jar")替换为@file:Import("myLib.kt")


谢谢您的回复。请再澄清一件事。您说:“此外,您不需要使用-include-runtime编译myLib”。即使jar文件使用kotlin标准库函数,这也是正确的吗?例如,如果我正在使用时间或日历函数,或者可能是nio包。 - virus00x
请参考问题更新。我需要一个不同的解决方案。 - virus00x
谢谢@Edgar Domingues。它起作用了。如果您不介意,能否请您解释一下将脚本文件重命名为myScript.main.kts的必要性。因为*.kts文件已经将其内容视为在主函数中编写。 - virus00x
老实说,我不太确定。我认为这是为了让 Kotlin 在类路径中包含 kotlin-main-kts.jar,这样它就需要解决依赖关系(例如 file:DependsOn 和 file:Import)。 - Edgar Domingues
如何使用@file:DependsOn()添加JAVA_HOME/lib/tool.jar?如果路径是动态的,则无法正常工作。 - OpenGG
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接