【发布时间】:2011-11-03 22:28:31
【问题描述】:
我的问题是关于运行由 sbt 0.10.1 管理的项目中的应用程序,因此依赖于其自动依赖管理(下载并设置适当的类路径以运行)。
当使用自动依赖管理时,似乎运行应用程序的唯一方法是使用 sbt 本身,因为它知道如何设置类路径(在 Ivy2 的帮助下)。 p>
如何在没有 sbt 的情况下运行应用程序?
【问题讨论】:
我的问题是关于运行由 sbt 0.10.1 管理的项目中的应用程序,因此依赖于其自动依赖管理(下载并设置适当的类路径以运行)。
当使用自动依赖管理时,似乎运行应用程序的唯一方法是使用 sbt 本身,因为它知道如何设置类路径(在 Ivy2 的帮助下)。 p>
如何在没有 sbt 的情况下运行应用程序?
【问题讨论】:
您还可以使用 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 应用程序的原因。
【讨论】:
sbt-start-script 的完整示例真的很受欢迎。
我使用retronym 的sbt-onejar plugin 创建了包含所有依赖项的可执行jar(很像Maven 的Assembly plugin)。它非常简单且有据可查。
【讨论】:
如果您想创建一个包含所有应用程序和依赖项的“胖”jar,您可以使用sbt-assembly plugin。然后,您可以在没有 sbt 的情况下将您的应用程序作为标准 jar 运行。
【讨论】:
您还可以创建任务来创建文件以启动应用程序。 @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 的文件,该文件的类路径设置正确以运行应用程序。调整口味。
【讨论】: