Java 使用依赖项评估kotlin脚本文件

Java 使用依赖项评估kotlin脚本文件,java,kotlin,kotlin-script,Java,Kotlin,Kotlin Script,问题:如何在运行时执行一组kotlin文件,并从中返回一个kts文件的结果 我编写了一个系统,它能够执行带有指令的kts文件。目前,它支持以下执行模式: main.kts-将执行此文件。它应该返回List 但是,用户可以将任何其他文件放在同一文件夹中。例如,文件夹可以包含以下文件: main.kts Constants.kt//它有一些常量 Helpers.kt//一些附加方法 具有计算代码的方法,但它只有一个输入文件 问题:如何让ScriptEngine将类编译成类路径,但只执行其中一个

问题:如何在运行时执行一组kotlin文件,并从中返回一个
kts
文件的结果

我编写了一个系统,它能够执行带有指令的
kts
文件。目前,它支持以下执行模式:

main.kts
-将执行此文件。它应该返回
List

但是,用户可以将任何其他文件放在同一文件夹中。例如,文件夹可以包含以下文件:

  • main.kts
  • Constants.kt
    //它有一些常量
  • Helpers.kt
    //一些附加方法
具有计算代码的方法,但它只有一个输入文件

问题:如何让ScriptEngine将类编译成类路径,但只执行其中一个

此解决方案不正确,因为文件顺序很重要(例如,如果第一个文件依赖于最后一个文件,则编译失败):

//这里有安全问题
val classLoader=Thread.currentThread().contextClassLoader
val engineManager=ScriptEngineManager(类加载器)
setIdeaIoUseFallback()
val ktsEngine:ScriptEngine=engineManager.getEngineeByExtension(“kts”)
/**
*这里有一个问题:如果file1需要file2编译,那么下面的执行就会失败。
*
*正确的方法:找到编译整个文件夹并计算单个文件的解决方案。
*/
filesFromFolderExceptMain.forEach{
ktsEngine.eval(it)
}
将ktsEngine.eval(mainScriptFile)作为列表返回
另一种解决方案(可能导致不可预测的编译波动):

val context=filesFromFolderExceptMain.joinToString(System.lineSeparator())
ktsEngine.eval(上下文)
将ktsEngine.eval(mainScriptFile)作为列表返回

所以,问题:如何在运行时执行一组kotlin文件并从中返回一个
kts
文件的结果?

您应该做的是将
@file:Import(“Constants.kt”、“Helpers.kt”)
添加到主脚本中(请参阅)。虽然我不确定它是相对于脚本所在的目录还是相对于工作目录


如果您不希望用户必须这样做,您可以将它们传入。

您应该做的是将
@file:Import(“Constants.kt”、“Helpers.kt”)
添加到主脚本(请参阅)。尽管我不确定它是相对于脚本所在的目录还是相对于工作目录

如果你不想让用户这么做,你可以把他们传进来