如何从 shell 运行 sbt 应用程序,以便我可以将我的应用程序作为普通的命令行程序运行(就像直接通过scala
但不必设置巨大的类路径)?
我知道我能做到:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
但是,(1) 需要永远启动,因为它启动 sbt,(2) 导致所有 stdout 和 stderr 转到 stdout,(3) 导致所有输出都用记录器 [info] 或 [error] 装饰。
我在看https://github.com/harrah/xsbt/wiki/Launcher https://github.com/harrah/xsbt/wiki/Launcher但它似乎太重量级了,因为它下载依赖项并设置新环境等等。我只想在现有的开发环境中运行这个应用程序。
到目前为止,我已经拼凑了自己的脚本来构建类路径,您还可以做一些其他事情,例如修改您的项目文件以使 sbt 打印原始类路径 https://groups.google.com/forum/#!topic/simple-build-tool/0rhVRPnjyZU,但我觉得一定有更好的方法。
这是我的 SBT(版本 0.10)项目定义中的内容,
val Mklauncher = config("mklauncher") extend(Compile)
val mklauncher = TaskKey[Unit]("mklauncher")
val mklauncherTask = mklauncher <<= (target, fullClasspath in Runtime) map { (target, cp) =>
def writeFile(file: File, str: String) {
val writer = new PrintWriter(file)
writer.println(str)
writer.close()
}
val cpString = cp.map(_.data).mkString(":")
val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="${CLASSPATH}" "$@"
""".format(cpString)
val targetFile = (target / "scala-sbt").asFile
writeFile(targetFile, launchString)
targetFile.setExecutable(true)
}
... // remember to add mklauncherTask to Project Settings
The mklauncher
任务创建脚本target/scala-sbt
执行的scala
项目类路径已经设置。如果有的话那就太好了mklauncher
每当类路径更改时就会自动执行,但我还没有考虑这样做。
(我使用 Java 类路径,而不是 Scala 的类路径,以便于创建嵌入式解释器。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)