Развертывание бинарных файлов Scala без зависимостей - PullRequest
10 голосов
/ 20 декабря 2011

Есть ли простой способ скопировать JAR Scala на сервер (~ 1 МБ), а затем SBT вытащить необходимые ему зависимости (~ 40 МБ) и запустить его?

Я видел sbt-onejar и sbt-assembly , но они объединяют все зависимости в один jar-файл, который в моем случае становится ~ 45 МБ, что занимает слишком много времени для загрузки на сервер.

В настоящее время я использую Capistrano для извлечения кода из GitHub и его компиляции. Затем я запускаю его с помощью xsbt-start-script-plugin - аналогично тому, как Heroku управляет этим.

Проблема в том, что компиляция занимает много времени на серверах (я использую EC2). EC2 Micro с оперативной памятью ~ 600 МБ занимает безумно долго и иногда случайным образом убивает процесс. Я использую небольшой экземпляр EC2 (1,7 ГБ ОЗУ), который работает в данный момент, но по мере увеличения базы кода и добавления новых серверов это может стать проблемой.

Идеальный рабочий процесс - это локальная компиляция исходных кодов Scala (или на сервере CI), копирование на сервер, добавление SBT дополнительных зависимостей с момента последней сборки (существующие будут исходить из локального кэшированного репозитория плюща), а затем предоставление мне с помощью простого скрипта для запуска сервиса с Upstart в Ubuntu 10.04.

Я также хотел бы услышать, как другие пользователи Scala используют свой код.


(код из "ответа", позже опубликованный OP)

Вот мои файлы сборки.

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 Ответ

8 голосов
/ 20 декабря 2011

Разверните свой .jar в хранилище (я использую Artifactory , но я думаю, что вы можете публиковать через scp в файловой системе), к которому ваши серверы могут получить доступ.Создайте пустой проект sbt, который зависит от файла .jar вашего приложения.Вы, серверы, можете вытащить и sbt update этот пустой проект, чтобы загрузить файлы JAR на сервер таким образом, чтобы использовать преимущества локального кэша плюща и обеспечить очень высокую пропускную способность.Тогда нужно просто выбрать правильный путь к классу для запуска вашего приложения.

Одна вещь, на которую вы должны обратить внимание, это убедиться, что sbt действительно обновит ваши зависимости.Был какой-то разговор об этом в Списке рассылки SBT .

Варианты запуска приложения (в порядке увеличения хитрости):

  • Просто запустите sbt run
  • Используйте sbt-onejar или sbt-assembly , чтобы создать один .jar, и запустите java -jar, чтобы запустить его
  • Напишите несколько сценариев sbt для создания пути к классам и используйте его для запуска приложения непосредственно из кэша Ivy. Кажется, я помню, что видел скрипт, который делает это недавно на SO, но не могу найти его в данный момент. Вы можете найти скрипт, который делает это в этом ответе SO , или(как вы предложили ниже) используйте xsbt-start-script-plugin .
...