Как запустить основной класс 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, но он кажется слишком тяжелым, поскольку он загружает зависимости и устанавливает новую среду и многое другое. Я просто хочу запустить это приложение в моей существующей среде разработки.
До сих пор я объединил свой собственный script, чтобы создать путь к классу, и вы также можете сделать некоторые другие вещи, такие как изменить файл проекта, чтобы получить sbt для печати raw classpath, но я чувствую, что должен быть лучший способ.
Ответы
Ответ 1
Плагин start- script SBT теперь находится на странице
https://github.com/sbt/sbt-start-script
Для установки и создания сценариев, которые не работают в OS X, требуется несколько шагов, но это может быть легко исправлено, если вы находитесь на этой платформе (см. ниже).
Настройка
-
Установить greadlink (только для OS X):
a) brew install coreutils
b) сопоставьте readlink с новой функцией ( g readlink), добавив эти строки в ~/.bashrc:
функция readlink() {greadlink "$ @"; }
export -f readlink`
-
Добавить плагин start- script в ~/.sbt/plugins/build.sbt:
addSbtPlugin ( "com.typesafe.sbt" % "sbt-start- script" % "0.8.0" )
-
Добавьте задачу start- script в текущий проект:
$ sbt add-start-script-tasks
# выполнить из каталога, в котором находится файл build.sbt
-
Добавить start- script поддержку текущего build.sbt:
import com.typesafe.sbt.SbtStartScript
seq (SbtStartScript.startScriptForClassesSettings: _ *)
Обратите внимание на пустую строку между утверждениями (де-шаблон для файлов сборки SBT).
Создать запуск Script
Затем, когда вы хотите создать script для запуска своего приложения, например sbt run-main
, но без sbt, выполните:
$ sbt start-script
Run
target/start mypackage.MyMainClass
Ответ 2
Вот что я имею в своем определении проекта 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}" "[email protected]"
""".format(cpString)
val targetFile = (target / "scala-sbt").asFile
writeFile(targetFile, launchString)
targetFile.setExecutable(true)
}
... // remember to add mklauncherTask to Project Settings
Задача mklauncher
создает script target/scala-sbt
, который выполняет scala
с уже установленным пути к классам проекта. Было бы неплохо, если бы mklauncher
выполнялся автоматически всякий раз, когда изменяется путь к классу, но я еще не занимался этим.
(Я просто использую Java classpath, а не Scala, для упрощения создания встроенных интерпретаторов.)
Ответ 3
Время летит, и многое изменилось с тех пор, как другие ответы. В настоящее время SBT 0.13.6
время.
Я думаю, что вам может понадобиться плагин sbt-onejar или плагин Native Packager для SBT.
sbt-onejar "является плагином простого построения для создания единого исполняемого JAR, содержащего весь ваш код и зависимости в виде вложенных JAR.
SBT Native Packager. Цель состоит в том, чтобы иметь возможность компоновать Scala программное обеспечение, созданное с помощью SBT для собственных систем упаковки, таких как deb, rpm, homebrew, msi. "
Ответ 4
Только что открыл плагин sbt start script: https://github.com/typesafehub/xsbt-start-script-plugin:
Этот плагин позволяет вам сгенерировать script цель/старт для проект. script будет запускать проект "на месте" (без необходимости сначала создайте пакет).
Цель/старт script аналогичен запуску sbt, но он не полагается на SBT. sbt run не рекомендуется для использования в производстве, поскольку он сохраняет SBT сам по себе. target/start предназначен для запуска приложения в производство.
Плагин добавляет задачу start- script, которая генерирует target/start. Это также добавляет сценическую задачу, сглаженную к задаче start-script.