Yan*_*ang 26 scala classpath sbt
如何从shell运行sbt应用程序,以便我可以将我的应用程序作为正常的命令行程序运行(就像直接通过scala
但不必设置庞大的类路径一样)?
我知道我能做到:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
Run Code Online (Sandbox Code Playgroud)
但是这(1)需要永远开始因为它启动sbt,(2)导致所有stdout和stderr转到stdout,并且(3)导致所有输出都用logger [info]或[error]进行修饰.
我查看了https://github.com/harrah/xsbt/wiki/Launcher,但它看起来太重了,因为它下载了依赖项并设置了一个新环境等等.我只想在现有的开发环境中运行这个应用程序.
到目前为止,我已经拼凑了我自己的脚本来构建一个类路径,你还可以做一些其他的事情,比如修改你的项目文件以获得sbt打印原始类路径,但我觉得必须有更好的方法.
Kip*_*ros 17
这是我在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
Run Code Online (Sandbox Code Playgroud)
该mklauncher
任务创建一个脚本target/scala-sbt
,该脚本scala
使用已设置的项目类路径执行.mklauncher
每当类路径发生变化时自动执行会很好,但我还没有考虑过这样做.
(我使用Java类路径,而不是Scala,以便于创建嵌入式解释器.)
Bre*_*ust 11
在启动脚本SBT插件现在是:
https://github.com/sbt/sbt-start-script
它需要几个步骤来设置和生成在OS X上不起作用的脚本,但如果您在该平台上,则可以轻松修复(见下文).
安装greadlink(仅限OS X):
一个) brew install coreutils
b)通过将这些行添加到〜/ .bashrc,将readlink 映射到新函数(g readlink):
function readlink(){greadlink"$ @"; }
export -f readlink`
将启动脚本插件添加到〜/ .sbt/plugins/build.sbt:
addSbtPlugin("com.typesafe.sbt"%"sbt-start-script"%"0.8.0")
将start-script任务添加到当前项目:
$ sbt add-start-script-tasks
#从build.sbt所在的目录执行
向当前build.sbt添加启动脚本支持:
import com.typesafe.sbt.SbtStartScript
seq(SbtStartScript.startScriptForClassesSettings:_*)
请注意语句之间的空白行(对于SBT构建文件而言是必需的).
然后,无论何时你想创建一个脚本来启动你的应用程序sbt run-main
,但没有sbt,执行:
$ sbt start-script
Run Code Online (Sandbox Code Playgroud)
target/start mypackage.MyMainClass
Run Code Online (Sandbox Code Playgroud)
时间过得很快,而且自从其他答案以来发生了很多变化.目前是SBT 0.13.6
时间.
我认为您可能需要的是sbt-onejar插件或SBT Native Packager插件.
sbt-onejar "是一个简单的构建工具插件,用于构建包含所有代码和依赖关系作为嵌套JAR的单个可执行JAR."
SBT Native Packager的"目标是能够捆绑使用SBT构建的Scala软件,用于原生包装系统,如deb,rpm,homebrew,msi."