Scala 如何从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]修饰 我看了一下,但它似乎太重了,因为它下载依赖项

如何从shell中运行sbt应用程序,以便可以作为普通的命令行程序运行我的应用程序(好像直接通过
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
    

    时间过得飞快,自从其他答案出现后,情况发生了很大的变化。现在是SBT
    0.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