Как запустить sbt-управляемый проект приложения без sbt?

Мой вопрос заключается в запуске приложения, которое в проекте управляется sbt 0.10.1 и, следовательно, зависит от его автоматического управления зависимостями (для загрузки и настройки соответствующего пути к классам для запуска).

При использовании автоматического управления зависимостями появляется, что единственный способ запуска приложения - использовать sbt, потому что он знает, как настроить путь к классам (с помощью Ivy2). p >

Как запустить приложение без sbt?

Ответы

Ответ 1

Вы также можете использовать Typesafe xsbt-start- script -plugin (изменить: теперь sbt-start-script) для создания оболочки script с правильным путем:

Этот плагин позволяет вам создать script target/start для проект. script будет запускать проект "на месте" (без сначала создать пакет).

target/start script похож на sbt run, но он не полагается на SBT. sbt run не рекомендуется для использования в производстве, поскольку сохраняет SBT сам в памяти. target/start предназначен для запуска приложение в производстве.

Плагин добавляет задачу start-script, которая генерирует target/start. Он также добавляет задачу stage, наложенную на задачу start-script.

Вот что Heroku использует для запуска приложений Scala.

Ответ 2

Я использовал retronym плагин sbt-onejar для создания исполняемые банки со всеми включенными зависимостями (так же, как Плагин сборки для Maven). Это очень просто и хорошо документировано.

Ответ 3

Если вы хотите создать "жирную" банку, содержащую все ваше приложение и ваши зависимости, вы можете использовать sbt-assembly plugin. Затем вы можете запустить приложение в качестве стандартного jar без sbt.

Ответ 4

Вы также можете создать задачу для создания файла для запуска приложения. @Kipton Barros опубликовал это в Как запустить основной класс sbt из оболочки в качестве обычной командной строки?:

  val MkUnixlauncher = config("mkunixlauncher") extend(Compile)
  val mkunixlauncher = TaskKey[Unit]("mkunixlauncher")
  val mkunixlauncherTask = mkunixlauncher <<= (target, fullClasspath in Runtime) map { (target, cp) =>
    def writeFile(file: File, str: String) {
      val writer = new PrintWriter(file)
      writer.println(str)
      writer.close()
    }
    val cpString = cp.map(_.data).mkString(System.getProperty("path.separator"))
    val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="${CLASSPATH}" "[email protected]"
""".format(cpString)
    val targetFile = (target / "scala-sbt").asFile
    writeFile(targetFile, launchString)
    targetFile.setExecutable(true)
  }

Создает файл с именем scala -sbt в вашем целевом каталоге, который правильно настроил путь к классу для запуска приложения. Тщательно по вкусу.