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