Как запустить 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 в вашем целевом каталоге, который правильно настроил путь к классу для запуска приложения. Тщательно по вкусу.