Как запустить основной 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].

Я посмотрел https://github.com/harrah/xsbt/wiki/Launcher, но он кажется слишком тяжелым, поскольку он загружает зависимости и устанавливает новую среду и еще много чего. Я просто хочу запустить это приложение в моей существующей среде разработки.

До сих пор я объединил свой собственный скрипт, чтобы создать путь к classам, и вы также можете сделать некоторые другие вещи, например, изменить файл проекта, чтобы получить sbt для печати исходного пути к classам , но я чувствую, что должен быть лучший способ.

Плагин стартового скрипта SBT теперь находится на:

https://github.com/sbt/sbt-start-script

Для установки и создания сценариев, которые не работают в OS X, требуется несколько шагов, но это можно легко устранить, если вы находитесь на этой платформе (см. Ниже).

Настроить

  1. Установите greadlink (только для OS X):

    а) brew install coreutils

    b) перевести readlink на новую функцию ( g readlink), добавив эти строки в ~ / .bashrc:

    function readlink () {greadlink “$ @”; }

    export -f readlink`

  2. Добавить плагин start-script в ~ / .sbt / plugins / build.sbt:

    addSbtPlugin (“com.typesafe.sbt”% “sbt-start-script”% “0.8.0”)

  3. Добавить задачу start-script в текущий проект:

    $ sbt add-start-script-tasks # выполнить из каталога, в котором находится build.sbt

  4. Добавьте поддержку 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. Он также добавляет сценическую задачу, наложенную на задачу запуска сценария.

  • Функциональное реактивное программирование в Scala
  • Почему неизменный Набор Скала не ковариант в своем типе?
  • Задача не сериализуема: java.io.NotSerializableException при вызове функции закрытие только для classов не объектов
  • Как определить разбиение DataFrame?
  • Получить экземпляр объекта-компаньона с новым API-интерфейсом Scala reflection
  • Что такое манифест в Скала и когда он вам нужен?
  • Какова (скрытая) стоимость ленивого значения Scala?
  • Как создать и использовать multidimensional array в Scala?
  • Не удается получить доступ к родительским элементам при работе с аннотациями макросов
  • Что делает `: _ *` (символ подчеркивания двоеточия) в Scala?
  • Объяснение метода складки искры RDD
  • Interesting Posts

    Что вызывает исключение java.lang.ArrayIndexOutOfBoundsException и как его предотвратить?

    Angular2 – * ngFor / цикл через json-объект с массивом

    При каких обстоятельствах SqlConnection автоматически включается в транзакцию TransactionScope?

    Как проверить текущую конфигурацию NTP системы?

    Каков правильный способ перегрузить operator == для иерархии classов?

    Обоснование макроса container_of в linux / list.h

    Как использовать decor_required декораторы в classах на основе django

    Как обращаться с CORS с использованием JAX-RS с Джерси

    Как удаленный рабочий стол (RDP) от Win 7 или XP до Win CE

    Преимущество создания общего репозитория против конкретного репозитория для каждого объекта?

    Android, как отображать 2 списка в одном действии один за другим

    Когда использовать IList и когда использовать List

    Карта, которая может быть итерирована в порядке значений

    HttpClient 4 – как захватить последний URL переадресации

    Как связаны zlib, gzip и zip? Что у них общего и как они отличаются?

    Давайте будем гением компьютера.