有没有一种简单的方法可以将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这是我的构建文件。
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")
resolvers += Classpaths.typesafeResolver
addSbtPlugin("com.typesafe.startscript" % "xsbt-start-script-plugin" % "0.5.0")
addSbtPlugin("com.eed3si9n" % "sbt-dirty-money" % "0.0.1")
答案 0 :(得分:8)
将.jar部署到存储库(我使用Artifactory,但我认为您可以通过scp发布到文件系统)服务器可以访问。创建一个空的sbt项目,该项目对应用程序的.jar文件具有单一依赖性。您的服务器可以拉动sbt update
这个空项目,以便利用本地常春藤缓存的方式将jar下载到服务器,并且带宽非常友好。然后,只需要获得正确的类路径来启动您的应用程序。
您必须注意的一件事是确保sbt实际上会更新您的依赖项。 some conversation about this上有SBT's mailing list。
启动应用程序的选项(按照增加的聪明程度)是:
sbt run
java -jar
以运行它