部署没有依赖项的Scala二进制文件

vau*_*han 10 deployment scala jar sbt

有没有一种简单的方法可以将Scala Jar(~1MB)复制到服务器,然后让SBT获取所需的依赖项(~40MB)并运行它?

我已经看过sbt-onejar和sbt-assembly,但是这些将所有依赖项捆绑到一个jar中,在我的情况下变为~45MB,这需要很长时间才能上传到服务器.

目前我使用Capistrano从GitHub检出我的代码并编译它.然后我使用xsbt-start-script-plugin运行它 - 类似于Heroku管理它的方式.

问题是编译需要很长时间在服务器上(我正在使用EC2).带有~600MB冲头的EC2 Micro需要很长时间,有时会随机杀死该过程.我正在使用目前正在运行的EC2 Small实例(1.7GB ram),但随着代码库的增加而我添加了更多服务器,它可能会出现问题.

理想的工作流程是在本地(或在CI服务器上)编译Scala源,复制到服务器,让SBT引入自上次构建以来添加的其他依赖项(现有的将来自本地缓存的常春藤repo),然后为我提供一个简单的在Ubuntu 10.04上使用Upstart运行服务的脚本.

我还想了解其他Scala用户如何部署他们的代码.


(OP后来发布的"回答"代码)

FWIW这里是我的构建文件.

build.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")
Run Code Online (Sandbox Code Playgroud)

项目/ 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")
Run Code Online (Sandbox Code Playgroud)

lee*_*777 8

将.jar部署到存储库(我使用Artifactory,但我认为您可以通过scp发布到文件系统),您的服务器可以访问它.创建一个空的sbt项目,该项目对应用程序的.jar文件具有单一依赖性.您的服务器可以拉动sbt update这个空项目,以便利用本地Ivy缓存的方式将jar下载到服务器,并且带宽非常友好.然后,只需要获得正确的类路径来启动您的应用程序.

您必须注意的一件事是确保sbt实际上会更新您的依赖项.在SBT的邮件列表上有一些关于此的讨论.

启动应用程序的选项(按照增加的聪明程度)是:

  • 赶紧跑 sbt run
  • 使用sbt-onejarsbt-assembly创建单个.jar并运行java -jar以运行它
  • 编写一些sbt脚本来构建类路径,并使用它来直接从常春藤缓存中启动应用程序. 我似乎记得最近在SO上看到了一个脚本,但目前还找不到它. 您可以在此SO答案中找到执行此操作的脚本,或者(如下所述)使用xsbt-start-script-plugin.