Развернуть 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.