如何在没有 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 clean”的情况下运行 Scala SBT Scoverage