Как запустить основной класс 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, но это можно легко исправить, если вы находитесь на этой платформе (см. Ниже).

Настроить

  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. Добавьте задачу запуска скрипта в текущий проект:

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

  4. Добавить поддержку 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.

Другие вопросы по тегам