该脚本必须即时编译。
把你的脚本放在一个标准的 sbt 项目中
在目录中,示例目录名称:“test1”
放置您的外部脚本(示例名称:“script.sc”)
// script.sc
println("Hello world!")
进入 test1 项目的资源目录(“test1\src\main\resources\script.sc”)
将项目发布到本地,即 sbt publishLocal
它被发布到“.ivy2\local\default\test1_2.12\0.1-SNAPSHOT\ ...”目录。
现在您可以使用以下菊石脚本“test.sc”。
它从本地 ivy 存储库中的 jar 中读取“script.sc”
并将其写入本地目录(必须具有读/写访问权限),然后执行外部进程,
它调用scala“解释器”并执行脚本。
// test.sc
import $ivy.`default:test1_2.12:0.1-SNAPSHOT`
val scriptCode = scala.util.Try {scala.io.Source.fromResource("script.sc").mkString} getOrElse """Println("Script-file not found!")"""
println("*" * 30)
println(scriptCode)
println("*" * 30)
println()
java.nio.file.Files.write(java.nio.file.Paths.get("script.sc"), scriptCode.getBytes(java.nio.charset.StandardCharsets.UTF_8))
val cmd = Seq("cmd.exe", "/c", "scala", "script.sc")
val output = sys.process.Process(cmd).!!
println(output)
执行 Ammonite REPL 脚本,您将获得:
******************************
// script.sc
println("Hello world!")
******************************
Hello world!
该脚本没有错误处理并将文件留在运行目录中。您可以使用“-savecompiled”编译器开关加快执行速度,即
val cmd = Seq("cmd.exe", "/c", "scala", "-savecompiled", "script.sc")
然后在运行目录中创建一个额外的 .jar 文件。