Как запустить основной class sbt из оболочки в качестве обычной командной строки?
Как я могу запустить приложение sbt из оболочки, чтобы я мог запускать свое приложение как обычную программу командной строки (как если бы он выполнялся напрямую через scala
но без необходимости создания огромного пути к classам)?
Я знаю, что могу сделать:
echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
Но это (1) начинается навсегда, потому что он запускает sbt, (2) заставляет все stdout и stderr перейти на stdout, и (3) заставляет весь вывод быть украшен регистратором [info] или [error].
- val и объект внутри classа scala?
- Что такое урожайность Скалы?
- scala.concurrent.blocking - что это на самом деле?
- Scala's '::', как это работает?
- Почему компилятор Scala не применяет оптимизацию хвостового вызова, если только метод не является окончательным?
Я посмотрел https://github.com/harrah/xsbt/wiki/Launcher, но он кажется слишком тяжелым, поскольку он загружает зависимости и устанавливает новую среду и еще много чего. Я просто хочу запустить это приложение в моей существующей среде разработки.
До сих пор я объединил свой собственный скрипт, чтобы создать путь к classам, и вы также можете сделать некоторые другие вещи, например, изменить файл проекта, чтобы получить sbt для печати исходного пути к classам , но я чувствую, что должен быть лучший способ.
- как сделать saveAsTextFile НЕ разделить вывод на несколько файлов?
- Scala underscore - ОШИБКА: отсутствует тип параметра для расширенной функции
- Что такое запечатанная черта?
- Исправляемые значения искры из строки
- Stackoverflow из-за длительной RDD Lineage
- Класс classа для отображения в Scala
- Как определить пользовательский разделитель для Spark RDD с одинаковым размером раздела, где каждый раздел имеет одинаковое количество элементов?
- Разница между Seq и списком в Scala
Плагин стартового скрипта 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”)
-
Добавить задачу start-script в текущий проект:
$ sbt add-start-script-tasks
# выполнить из каталога, в котором находится build.sbt -
Добавьте поддержку start-script в текущий файл build.sbt:
import com.typesafe.sbt.SbtStartScript
seq (SbtStartScript.startScriptForClassesSettings: _ *)
Обратите внимание на пустую строку между утверждениями (де-фактория для файлов сборки 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}" "[email protected]" """.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
скрипт target/scala-sbt
который выполняет scala
с уже установленным target/scala-sbt
пути проекта. Было бы неплохо, если бы mklauncher
выполнялся автоматически всякий раз, когда изменяется mklauncher
classpath, но я еще не занимался этим.
(Я использую Java classpath, а не Scala, для удобства создания встроенных интерпретаторов.)
Время летит, и многое изменилось с тех пор, как другие ответы. В настоящее время SBT 0.13.6
раз.
Я думаю, что вам может понадобиться плагин sbt-onejar или плагин Native Packager для SBT .
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, но он не полагается на SBT. sbt run не рекомендуется для использования в производстве, поскольку он сохраняет SBT сам в памяти. target / start предназначен для запуска приложения в процессе производства.
Плагин добавляет старт-скрипт задачи, который генерирует target / start. Он также добавляет сценическую задачу, наложенную на задачу запуска сценария.