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

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

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

Как я могу запустить приложение без SBT?

4 ответа

Решение

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

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

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

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

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

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

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

Вы также можете создать задачу для создания файла для запуска приложения. @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}" "$@"
""".format(cpString)
    val targetFile = (target / "scala-sbt").asFile
    writeFile(targetFile, launchString)
    targetFile.setExecutable(true)
  }

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

Другие вопросы по тегам