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

时间:2011-12-20 04:23:33

标签: scala deployment 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引入自上次构建以来添加的其他依赖项(现有的来自本地缓存的常春藤存储库),然后提供给我使用简单的脚本在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")

项目/ 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")

1 个答案:

答案 0 :(得分:8)

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

您必须注意的一件事是确保sbt实际上会更新您的依赖项。 some conversation about this上有SBT's mailing list

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

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