如何从shell运行sbt主类作为普通的命令行程序?

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,以便于创建嵌入式解释器.)

  • 当你完成在类路径改变时(例如,今晚?;-)完成mklauncher重建时,把它变成一个插件,把它发送到github,并把它放在sbt插件页面,好吗? (16认同)

Bre*_*ust 11

启动脚本SBT插件现在是:

https://github.com/sbt/sbt-start-script

它需要几个步骤来设置和生成在OS X上不起作用的脚本,但如果您在该平台上,则可以轻松修复(见下文).

建立

  1. 安装greadlink(仅限OS X):

    一个) brew install coreutils

    b)通过将这些行添加到〜/ .bashrc,将readlink 映射到新函数(g readlink):

    function readlink(){greadlink"$ @"; }

    export -f readlink`

  2. 将启动脚本插件添加到〜/ .sbt/plugins/build.sbt:

    addSbtPlugin("com.typesafe.sbt"%"sbt-start-script"%"0.8.0")

  3. 将start-script任务添加到当前项目:

    $ sbt add-start-script-tasks #从build.sbt所在的目录执行

  4. 向当前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)


Jac*_*ski 9

时间过得很快,而且自从其他答案以来发生了很多变化.目前是SBT 0.13.6时间.

我认为您可能需要的是sbt-onejar插件SBT Native Packager插件.

sbt-onejar "是一个简单的构建工具插件,用于构建包含所有代码和依赖关系作为嵌套JAR的单个可执行JAR."

SBT Native Packager"目标是能够捆绑使用SBT构建的Scala软件,用于原生包装系统,如deb,rpm,homebrew,msi."