Как запустить основной класс sbt из оболочки как обычную программу командной строки?
Как я могу запустить приложение sbt из оболочки, чтобы я мог запустить свое приложение как обычную программу командной строки (как если бы она запускалась напрямую через scala
но без необходимости создания огромного пути к классам)?
Я знаю, что могу сделать:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
Но для этого (1) требуется вечность, потому что он запускает sbt, (2) заставляет все stdout и stderr переходить на stdout, а (3) заставляет весь вывод быть оформленным с помощью регистратора [info] или [error].
Я посмотрел на https://github.com/harrah/xsbt/wiki/Launcher но он кажется слишком тяжелым, так как он загружает зависимости и устанавливает новую среду и так далее. Я просто хочу запустить это приложение в моей существующей среде разработки.
До сих пор я собрал свой собственный сценарий для создания пути к классам, и вы также можете делать некоторые другие вещи, такие как изменение файла проекта, чтобы sbt печатал необработанный путь к классам, но я чувствую, что должен быть лучший способ.
4 ответа
Плагин start-script SBT теперь находится по адресу:
https://github.com/sbt/sbt-start-script
Требуется несколько шагов для настройки и создания сценариев, которые не работают в OS X, но это можно легко исправить, если вы находитесь на этой платформе (см. Ниже).
Настроить
Установите greadlink (только OS X):
а)
brew install coreutils
b) сопоставить readlink с новой функцией (g readlink), добавив эти строки в ~ /.bashrc:
function readlink () {greadlink "$ @"; }
export -f readlink`
Добавьте плагин start-script в ~ /.sbt / plugins / build.sbt:
addSbtPlugin ("com.typesafe.sbt"% "sbt-start-script"% "0.8.0")
Добавьте задачу запуска скрипта в текущий проект:
$ sbt add-start-script-tasks
# выполнить из каталога, в котором находится build.sbtДобавить поддержку start-script в текущий build.sbt:
import com.typesafe.sbt.SbtStartScript
seq (SbtStartScript.startScriptForClassesSettings: _ *)
Обратите внимание на пустую строку между операторами (de rigueur для файлов сборки SBT).
Создать стартовый скрипт
Затем, когда вы хотите создать скрипт для запуска вашего приложения, как sbt run-main
, но без sbt, выполните:
$ sbt start-script
Бежать
target/start mypackage.MyMainClass
Вот что я имею в своем определении проекта SBT (версия 0.10),
val Mklauncher = config("mklauncher") extend(Compile)
val mklauncher = TaskKey[Unit]("mklauncher")
val mklauncherTask = mklauncher <<= (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(":")
val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="${CLASSPATH}" "$@"
""".format(cpString)
val targetFile = (target / "scala-sbt").asFile
writeFile(targetFile, launchString)
targetFile.setExecutable(true)
}
... // remember to add mklauncherTask to Project Settings
mklauncher
задача создает скрипт target/scala-sbt
который выполняет scala
с установленным classpath проекта. Было бы неплохо иметь mklauncher
выполняется автоматически всякий раз, когда изменяется путь к классу, но я еще не рассматривал это.
(Я использую Java classpath, а не Scala, для простоты создания встроенных интерпретаторов.)
Время летит, и многое изменилось со времени других ответов. Это в настоящее время SBT 0.13.6
время.
Я думаю, что вам может понадобиться плагин sbt-onejar или плагин SBT Native Packager.
sbt-onejar "это простой плагин для сборки инструментов для создания одного исполняемого JAR-файла, содержащего весь ваш код и зависимости в виде вложенных JAR-файлов."
Цель SBT Native Packager - иметь возможность объединять программное обеспечение Scala, созданное с использованием SBT, для собственных систем упаковки, таких как deb, rpm, homebrew, msi ".
Только что обнаружил плагин сценария запуска sbt: https://github.com/typesafehub/xsbt-start-script-plugin:
Этот плагин позволяет генерировать сценарий цели / запуска для проекта. Скрипт запустит проект "на месте" (без предварительной сборки пакета).
Сценарий target / start аналогичен sbt run, но не использует SBT. sbt run не рекомендуется для производственного использования, поскольку он хранит SBT в памяти. target / start предназначен для запуска приложения в производстве.
Плагин добавляет старт-скрипт задачи, который генерирует цель / старт. Он также добавляет сценическое задание, связанное с заданием start-script.