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

2024-03-18

有没有一种简单的方法可以将 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(使用前将#替换为@)

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

随机推荐

  • 如何将选择字段的文本转换为图标?

    救救吧 伙计们 我的共享点页面中有一个选择字段 其中的选项如下 1 Go 2 Warning 3 Stop 现在 我希望它以图标而不是文本的形式出现在列表中 我有一个可用的 jquery 脚本 但需要很长时间才能搜索所有列表中包含的文本 而
  • 无法获取当前用户:没有可用的 RequestContext

    使用 xsuaa approuter 登录获取登录的用户对象时出现以下异常 User currentUser UserAccessor getCurrentUser 我要在不使用 GuiceFilter 的情况下获取 currentUser
  • 我可以使用 Python 为所有主流浏览器开发扩展吗?

    我可以用吗Python为所有主流浏览器开发扩展 如果不是 那么我需要了解哪些语言来开发扩展 Chrome Firefox Safari IE Opera 大多数扩展只是捆绑的 HTML CSS JS 和图像文件 以及一些元数据 你需要精通
  • 设计方法:过载与开关?

    关于封装设计的性能和可扩展性 最好是 重载 函数名称 让 Mathematica 根据模式 条件 测试以及系统对定义的排序方式来确定要使用哪个版本 或者使用 Switch 或类似命令 构建单个函数来直接求值 Mathematica 的表达能
  • 使用 Flexbox 垂直居中项目

    我正在尝试使用 CSS 的 flexbox 垂直居中项目 而且 我知道如何使用非供应商前缀的代码来做到这一点 但即使使用供应商前缀 我也无法让它在 Webkit Chrome 中工作 我正在尝试垂直对齐 trigger 中的跨度 这是我的C
  • 更新到 Xcode 10.2 后,构建在 testflight 上黑屏

    我的应用程序完美运行 我已将 Xcode 更新到最新的 10 2 版本 但发生了一些奇怪的事情 与任何更新一样 该应用程序在调试器上运行顺利 完全没有问题 当我将一个版本存档到 testflight 时 该版本显示启动画面 然后进入黑屏 不
  • 如何安装 DB2 ODBC 或 OLEDB 驱动程序

    我已经在 Windows 7 Pro 上安装了 IBM DB2 Database Express 现在 我想创建 C 代码以便在 DB2 表中选择 插入 更新记录 我花了一整天的时间在互联网上搜索有关如何安装 OLEDB 或 ODBC 驱动
  • vue js 2 对表格进行排序

    我有两个关于 vue js 2 的问题和一个小提琴 https jsfiddle net tmun9cxa 1 https jsfiddle net tmun9cxa 1 当您单击列标题时 为什么我的排序不起作用 解决办法是什么 如何让搜索
  • 指定 PHP 代码来选择日期和 3 天前的记录

    我正在尝试从 SQL 表中调用仅 3 天前的数据 我的表中有一个磅日期列 并且是日期格式 我已尝试以下操作 但根本没有从查询中得到任何结果 result mysql query SELECT DATE FORMAT datetime y m
  • Ruby:如何递归查找并删除空目录?

    我正在尝试编写一些 ruby 它会递归地搜索给定目录中的所有空子目录并删除它们 想法 注意 如果可能的话 我想要一个脚本版本 这既是实际需要 也是帮助我学习的东西 In ruby Dir select d File directory d
  • 如果 Ruby 和 Python 都允许猴子修补,为什么 Ruby 中的争议更大?

    在我听说过的许多关于 Ruby 的讨论中 人们都表达了对这种语言的保留意见 猴子补丁问题成为他们最关心的问题之一 然而 我很少听到在 Python 环境中提出相同的论点 尽管它在 Python 语言中也是允许的 为什么会有这样的区别 Pyt
  • 如何从批处理文件执行PowerShell命令?

    我有一个 PowerShell 脚本 用于将网站添加到 Internet Explorer 中的受信任站点 set location HKCU Software Microsoft Windows CurrentVersion Intern
  • 如何声明构造函数?

    当我编译程序时出现以下错误 Microsoft Samples Kinect ControlsBasics SelectionDisplay 不 包含一个带有 2 个参数的构造函数 我可能需要为我创建的新事物声明另一个构造函数 但我不知道该
  • 为什么我在 Python 中得到 hmac 的错误结果,而在 Perl 中却没有?

    我正在尝试使用 sha 512 计算 hmac Perl 代码 use Digest SHA qw hmac sha512 hex key x0b x20 data Hi There hash hmac sha512 hex data ke
  • 是否可以搜索所有 xcodes 日志

    XCode 现在可以方便地保存之前运行的日志 这很棒 有没有办法搜索所有日志 我的用例是我看到了一个特定的错误 但不记得它是在哪个运行中 我需要从日志中找到错误 URL Xcode 将调试日志存储在 Library Developer Xc
  • 如何使用类似 Type() 的语法对 Type* 指针进行值初始化?

    内置类型的变量可以像这样进行值初始化 https stackoverflow com questions 2584213 how to default initialize local variables of built in types
  • 将文件发送到 WiFi 打印机

    我正在开发一个应用程序 在该应用程序中 我通过 IP 地址和端口号 即 txt png jpg doc 将文件从我的手机发送到 WiFi 打印机 它们应该从打印机打印出来 我尝试过以下代码 但它只为我提供 txt 文件的输出 需要进行哪些更
  • finishActivity() - 使用确切的请求代码关闭所有活动

    我是 android 新手 但还在战斗 我决定编写 mp3 播放器 我的一些任务有问题 我想从文件浏览器中选择要播放的文件 它是这样实现的 A类的Activity启动B类的Activity 然后开始了几次B班的活动 每次用startActi
  • 如何使用 HTML5 Canvas 作为 WebGL 纹理

    我想要 为情况 i 设置统一值 将案例 i 的计算着色器渲染为 HTML5
  • 部署没有依赖项的 Scala 二进制文件

    有没有一种简单的方法可以将 Scala Jar 1MB 复制到服务器 然后让 SBT 提取它所需的依赖项 40MB 并运行它 我见过 sbt onejar 和sbt组装 https github com sbt sbt assembly 但