Как запустить основной класс sbt из оболочки как обычную программу командной строки? - PullRequest
26 голосов
/ 21 августа 2011

Как я могу запустить приложение 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 ]

17 голосов
/ 21 августа 2011

Вот что у меня есть в определении проекта 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 с уже заданным путем к классам проекта.Было бы неплохо, чтобы mklauncher выполнялся автоматически всякий раз, когда изменяется путь к классу, но я пока не стал этого делать.

(я использую Java-путь к классам, а не Scala, для простоты создания встроенных интерпретаторов.)

10 голосов
/ 24 июля 2013

Плагин start-script SBT теперь находится по адресу:

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

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

Настройка

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

    a) brew install coreutils

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

    readlink () {greadlink "$ @";}

    export -f readlink`

  2. Добавить плагин сценария запуска в ~ / .sbt / plugins / build.sbt:

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

  3. Добавить задачу сценария запуска в текущий проект:

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

  4. Добавить поддержку сценария запуска в текущий build.sbt:

    import com.typesafe.sbt.SbtStartScript

    seq (SbtStartScript.startScriptForClassesSettings: _ *)

Обратите внимание на пустую строку между операторами (de rigueur для файлов сборки SBT).

Создать сценарий запуска

Затем, когда вы захотите создать скрипт для запуска вашего приложения, например sbt run-main, но без sbt, выполните:

$ sbt start-script

Выполните

target/start mypackage.MyMainClass
9 голосов
/ 29 декабря 2013

Время летит, и многое изменилось с тех пор, как другие ответы. Сейчас время SBT 0.13.6.

Я думаю, что вам может понадобиться плагин sbt-onejar или плагин SBT Native Packager .

sbt-onejar "- это плагин для простого инструмента сборки для создания одного исполняемого JAR-файла, содержащего весь ваш код и зависимости в виде вложенных JAR-файлов."

SBT Native Packager "Цель состоит в том, чтобы иметь возможность объединить программное обеспечение Scala, созданное с SBT, для собственных систем упаковки, таких как deb, rpm, homebrew, msi."

2 голосов
/ 15 февраля 2012

Только что обнаружил плагин sbt start script: https://github.com/typesafehub/xsbt-start-script-plugin:

Этот плагин позволяет генерировать сценарий цели / запуска для проект. Скрипт будет запускать проект «на месте» (без необходимости сначала создайте пакет).

Сценарий target / start аналогичен sbt run, но не зависит от SBT. sbt run не рекомендуется для производственного использования, потому что он сохраняет Сам SBT в памяти. target / start предназначен для запуска приложения в производство.

Плагин добавляет скрипт запуска задачи, который генерирует цель / старт. Это также добавляет сценическое задание с псевдонимом к задаче start-script.

...