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