有没有一种简单的方法可以将 Scala Jar(~1MB)复制到服务器,然后让 SBT 提取它所需的依赖项(~40MB)并运行它?
我见过 sbt-onejar 和sbt组装 https://github.com/sbt/sbt-assembly,但是这些将所有依赖项捆绑到一个 jar 中,在我的情况下,该 jar 变成 ~45MB,上传到服务器需要很长时间。
目前我使用 Capistrano 从 GitHub 签出我的代码并编译它。然后我使用 xsbt-start-script-plugin 运行它 - 类似于 Heroku 的管理方式。
问题是编译在服务器上需要很长时间(我使用的是EC2)。具有约 600MB 内存的 EC2 Micro 需要非常长的时间,有时会随机终止该进程。我使用的是 EC2 Small 实例(1.7GB 内存),目前正在运行,但随着代码库的增加以及我添加更多服务器,它可能会出现问题。
理想的工作流程是在本地(或在 CI 服务器上)编译 Scala 源代码,复制到服务器,让 SBT 引入自上次构建以来添加的其他依赖项(现有的依赖项将来自本地缓存的 ivy 存储库),然后为我提供一个简单的在 Ubuntu 10.04 上使用 Upstart 运行服务的脚本。
我还想听听其他 Scala 用户如何部署他们的代码。
(代码来自OP后来发布的“答案”)
FWIW 这是我的构建文件。
构建.sbt
import com.typesafe.startscript.StartScriptPlugin
name := "XXX"
version := "0.1.0"
scalaVersion := "2.9.1"
resolvers += "XXX" at "http://repo.XXX.XXX"
libraryDependencies += "XXXX" %% "backend" % "0.1.0"
seq(StartScriptPlugin.startScriptForJarSettings: _*)
mainClass in Compile := Some("XXX.app.Main")
项目/build.sbt
resolvers += Classpaths.typesafeResolver
addSbtPlugin("com.typesafe.startscript" % "xsbt-start-script-plugin" % "0.5.0")
addSbtPlugin("com.eed3si9n" % "sbt-dirty-money" % "0.0.1")
将您的 .jar 部署到存储库(我使用人工工厂 http://www.jfrog.com/products.php,但我认为您可以通过 scp 发布到您的服务器可以访问的文件系统)。创建一个空的 sbt 项目,该项目对应用程序的 .jar 文件具有单一依赖项。您的服务器可以拉取并sbt update
这个空项目以利用本地 Ivy 缓存的方式将 jar 下载到服务器,并且对带宽非常友好。然后只需获取正确的类路径来启动您的应用程序即可。
您必须注意的一件事是确保 sbt 确实会更新您的依赖项。有过关于这个的一些对话 https://groups.google.com/d/topic/simple-build-tool/fKCYUhVXBiw/discussion on SBT 的邮件列表 https://groups.google.com/forum/#!forum/simple-build-tool.
启动应用程序的选项(按照聪明程度递增的顺序)是:
- 赶紧跑
sbt run
- Use sbt-奥内贾尔 https://github.com/retronym/sbt-onejar or sbt组装 https://github.com/sbt/sbt-assembly创建一个 .jar 并运行
java -jar
运行它
- 编写一些 sbt 脚本来构建类路径,并使用它直接从 Ivy 缓存启动应用程序。
我似乎记得最近在 SO 上看到过一个执行此操作的脚本,但目前找不到它。 您可以找到一个执行此操作的脚本在这个SO答案中 https://stackoverflow.com/a/7135161/115478,或者(正如您下面建议的那样)使用xsbt-启动脚本插件 https://github.com/typesafehub/xsbt-start-script-plugin.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)