如何在没有 sbt 的情况下运行 sbt 管理的应用程序项目?

Posted

技术标签:

【中文标题】如何在没有 sbt 的情况下运行 sbt 管理的应用程序项目?【英文标题】:How to run a sbt-managed application project without sbt? 【发布时间】:2011-11-03 22:28:31 【问题描述】:

我的问题是关于运行由 sbt 0.10.1 管理的项目中的应用程序,因此依赖于其自动依赖管理(下载并设置适当的类路径以运行)。

当使用自动依赖管理时,似乎运行应用程序的唯一方法是使用 sbt 本身,因为它知道如何设置类路径(在 Ivy2 的帮助下)。 p>

如何在没有 sbt 的情况下运行应用程序?

【问题讨论】:

【参考方案1】:

您还可以使用 Typesafe 的 xsbt-start-script-plugin(编辑:现在 sbt-start-script)生成具有正确类路径的 shell 脚本:

这个插件允许你生成一个脚本target/start 项目。该脚本将“就地”运行项目(无需 先构建一个包)。

target/start 脚本类似于sbt run,但它不依赖 在 SBT 上。 sbt run 不推荐用于生产环境,因为它 将 SBT 本身保存在内存中。 target/start 旨在运行 生产中的应用程序。

插件添加了一个任务start-script,它生成target/start。 它还添加了一个stage 任务,别名为start-script 任务。

这就是 Heroku uses 运行 Scala 应用程序的原因。

【讨论】:

你好,Ben,也许你对this question有提示? sbt-start-script 的完整示例真的很受欢迎。【参考方案2】:

我使用retronym 的sbt-onejar plugin 创建了包含所有依赖项的可执行jar(很像Maven 的Assembly plugin)。它非常简单且有据可查。

【讨论】:

+1 retronym 插件看起来比我建议的要好,因为它不会解压依赖项【参考方案3】:

如果您想创建一个包含所有应用程序和依赖项的“胖”jar,您可以使用sbt-assembly plugin。然后,您可以在没有 sbt 的情况下将您的应用程序作为标准 jar 运行。

【讨论】:

【参考方案4】:

您还可以创建任务来创建文件以启动应用程序。 @Kipton Barros 在How do I run an sbt main class from the shell as normal command-line program? 中发布了这个:

  val MkUnixlauncher = config("mkunixlauncher") extend(Compile)
  val mkunixlauncher = TaskKey[Unit]("mkunixlauncher")
  val mkunixlauncherTask = mkunixlauncher <<= (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(System.getProperty("path.separator"))
    val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="$CLASSPATH" "$@"
""".format(cpString)
    val targetFile = (target / "scala-sbt").asFile
    writeFile(targetFile, launchString)
    targetFile.setExecutable(true)
  

这会在您的目标目录中创建一个名为 scala-sbt 的文件,该文件的类路径设置正确以运行应用程序。调整口味。

【讨论】:

这最接近我想要实现的目标。

以上是关于如何在没有 sbt 的情况下运行 sbt 管理的应用程序项目?的主要内容,如果未能解决你的问题,请参考以下文章

sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?

SBT 停止运行而不退出

是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage

linux无网情况下 如何安装 sbt

如何使用 SBT 和 IntelliJ IDEA 管理多个相互依赖的模块?

从 Eclipse 运行 SBT 任务