gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:06:34 25 4
gpt4 key购买 nike

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

我见过 sbt-onejar 和 sbt-assembly ,但是这些将所有依赖项捆绑到一个 jar 中,在我的情况下变成了大约 45MB,这需要很长时间才能上传到服务器。

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

问题是在服务器上编译需要很长时间(我使用的是 EC2)。具有 ~600MB ram 的 EC2 Micro 需要非常长的时间,有时会随机终止进程。我正在使用目前正在运行的 EC2 小型实例(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 部署到您的服务器可以访问的存储库(我使用 Artifactory ,但我认为您可以通过 scp 发布到文件系统)。创建一个空的 sbt 项目,该项目对您的应用程序的 .jar 文件具有单一依赖项。你的服务器可以拉和 sbt update这个空项目以利用本地 Ivy 缓存的方式将 jar 下载到服务器,并且非常适合带宽使用。然后只需获取正确的类路径来启动您的应用程序。

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

启动应用程序的选项(按智能程度递增)是:

  • 就跑 sbt run
  • 使用 sbt-onejarsbt-assembly创建单个 .jar 并运行 java -jar运行它
  • 编写一些 sbt 脚本来构建类路径,并使用它直接从 Ivy 缓存中启动应用程序。我似乎记得最近在 SO 上看到过一个脚本来执行此操作,但目前找不到。您可以找到执行此操作的脚本 in this SO answer ,或(如您在下面建议的)使用 xsbt-start-script-plugin .
  • 关于scala - 部署没有依赖项的 Scala 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570792/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com