Scala 如何从shell运行sbt主类作为普通命令行程序?
如何从shell中运行sbt应用程序,以便可以作为普通的命令行程序运行我的应用程序(好像直接通过Scala 如何从shell运行sbt主类作为普通命令行程序?,scala,classpath,sbt,Scala,Classpath,Sbt,如何从shell中运行sbt应用程序,以便可以作为普通的命令行程序运行我的应用程序(好像直接通过scala运行,但不必设置大量的类路径) 我知道我能做到: echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt 但这(1)需要永远启动,因为它启动sbt,(2)导致所有stdout和stderr转到stdout,以及(3)导致所有输出用记录器[info]或[error]修饰 我看了一下,但它似乎太重了,因为它下载依赖项
scala
运行,但不必设置大量的类路径)
我知道我能做到:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
但这(1)需要永远启动,因为它启动sbt,(2)导致所有stdout和stderr转到stdout,以及(3)导致所有输出用记录器[info]或[error]修饰
我看了一下,但它似乎太重了,因为它下载依赖项并建立一个新的环境等等。我只想在我现有的开发环境中运行此应用程序
到目前为止,我已经拼凑了我自己的脚本来构建一个类路径,您也可以做一些其他事情,比如,但我觉得一定有更好的方法。以下是我在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
val Mklauncher=config(“Mklauncher”)扩展(编译)
val mklauncher=任务键[单位](“mklauncher”)
val mklauncher任务=mklauncher刚刚发现sbt启动脚本插件::
这个插件允许您为一个脚本生成一个脚本目标/开始
项目脚本将“就地”运行项目(无需
首先构建一个包)
目标/启动脚本类似于sbt run,但它不依赖于
SBT。sbt运行不建议用于生产,因为它保持
SBT本身在内存中。目标/开始用于在中运行应用程序
生产
该插件添加了一个任务启动脚本,该脚本生成target/start。信息技术
还将添加一个阶段任务(别名为“开始脚本”任务)
网站现为:
它需要几个步骤来设置和生成无法在OSX上工作的脚本,但如果您在该平台上,则可以轻松修复这些脚本(请参见下文)
安装程序
安装greadlink(仅限OS X):
a) brew安装coreutils
b) 通过将以下行添加到~/.bashrc,将readlink映射到新函数(greadlink):
函数readlink(){greadlink“$@”;}
导出-f readlink`
将启动脚本插件添加到~/.sbt/plugins/build.sbt:
addSbtPlugin(“com.typesafe.sbt”%”sbt开始脚本“%”0.8.0)
将开始脚本任务添加到当前项目:
$sbt添加启动脚本任务
#从build.sbt所在的目录执行
将启动脚本支持添加到当前build.sbt:
导入com.typesafe.sbt.SbtStartScript
seq(SbtStartScript.startscriptforlassesettings:*)
注意语句之间的空行(SBT生成文件的DE Rebug)。
生成开始脚本
然后,无论何时,只要您想创建一个脚本来启动您的应用程序,如
sbt run main
,但没有sbt,请执行:
$ sbt start-script
跑
时间过得飞快,自从其他答案出现后,情况发生了很大的变化。现在是SBT0.13.6
时间
我想你可能需要的是或
sbt-onejar“是一个简单的构建工具插件,用于构建一个可执行的JAR,其中包含作为嵌套JAR的所有代码和依赖项。”
SBT Native Packager的目标是能够捆绑使用SBT构建的用于本机打包系统的Scala软件,如deb、rpm、homebrew、msi。”当您完成mklauncher重建时,只要类路径发生变化(比如,今晚?;-),将其转换为插件,发送到github,并将其放入SBT插件页面,好吗?听丹尼尔的要求;-)类似于mvn exec:java
或mvn appassembler:assemble
sbt本机打包机看起来是这两个包中维护得最多的一个(?)。在我的卑微经历中,你的速度相对较快。这个插件很棒,但在GITHUB的顶部,他们非常公平地考虑SBT本地打包机。instead@tksfz是的,事情变得更好了。。。SBT原生包装机很棒。
target/start mypackage.MyMainClass