Развернуть Scala двоичные файлы без зависимостей
Есть ли простой способ скопировать Scala Jar (~ 1MB) на сервер, а затем использовать SBT в зависимостях (~ 40 МБ), которые ему нужны, и запустить его?
Я видел sbt-onejar и sbt-assembly, но они объединяют все зависимости в одну банку, которая в моем случае становится ~ 45 МБ, что занимает слишком много времени для загрузки на сервер.
В настоящий момент я использую Capistrano для проверки моего кода из GitHub и компиляции его. Затем я запускаю его с помощью xsbt-start- script -plugin - подобно тому, как это управляет Heroku.
Проблема в том, что компиляция занимает много времени на серверах (я использую EC2). EC2 Micro с RAM ~ 600 МБ занимает безумно длинную и иногда случайным образом убивает процесс. Я использую экземпляр EC2 Small (1.7GB ram), который работает на данный момент, но по мере увеличения базы кода и добавления большего количества серверов может возникнуть проблема.
Идеальный рабочий процесс состоял бы в том, чтобы скомпилировать источники Scala локально (или на CI-сервере), скопировать на сервер, добавить SBT дополнительные зависимости, добавленные после последней сборки (существующие из них будут поступать из локального кэшированного реплива плюща), тогда предоставить мне простой script для запуска службы с помощью Upstart на Ubuntu 10.04.
Я также хотел бы услышать, как другие пользователи 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
Разверните свой .jar в репозиторий (я использую Artifactory, но я думаю, что вы можете публиковать через scp в файловой системе), что ваши серверы может получить доступ. Создайте пустой проект sbt, который имеет одну зависимость от вашего файла .jar приложения. Серверы могут вытащить и sbt update
этот пустой проект, чтобы загрузить банки на сервер таким образом, чтобы использовать локальный кеш Ivy и очень удобен для обмена данными. Тогда это просто вопрос получения правильного пути к классу для запуска вашего приложения.
Одна вещь, на которую вы должны обратить внимание, - убедиться, что sbt действительно обновит ваши зависимости. Был некоторый разговор об этом на список рассылки SBT.
Опции запуска приложения (в порядке возрастания умения):
- Просто запустите
sbt run
- Используйте sbt-onejar или sbt-assembly, чтобы создать один .jar и запустить
java -jar
для его запуска
- Напишите некоторые скрипты sbt для создания пути к классам и используйте это для запуска приложения непосредственно из кеша Ivy.
Кажется, мне кажется, что мы видим, что script делает это недавно на SO, но не может найти его в данный момент. Вы можете найти script, который делает это в этом ответе SO или (как вы предложили ниже) используйте xsbt-start-script-plugin.