Sbt: выбор основного класса для запуска
У меня есть ~ 6 основных классов в моем приложении, я обычно использую только один из них, поэтому я хотел запустить его автоматически с помощью sbt. sbt позволяет определить два ключа в файле build.sbt:
// Run Key
val selectMainClass = TaskKey[Option[String]]("select-main-class", "Selects the main class to run.")
val mainClass = TaskKey[Option[String]]("main-class", "Defines the main class for packaging or running.")
поэтому я определил их (пример проекта, два класса - Main1 и Main2 в корневом каталоге исходного каталога):
mainClass := Some("Main1")
selectMainClass := Some("Main1")
И `show main-class 'из приглашения sbt также работает:
[info] Some(Main1)
Но задача sbt run
по-прежнему вызывает запрос для основного класса.
Кроме того, sbt-revolver не работает с несколькими классами с исключением java.util.NoSuchElementException: None.get
Использование sbt 0.11.2.
Что я здесь делаю неправильно?
Ответы
Ответ 1
Как вы можете видеть из проверки, mainClass привязан к различным конфигурациям и задачам:
> inspect compile:main-class(for run)
[info] Task: scala.Option[java.lang.String]
[info] Description:
[info] Defines the main class for packaging or running.
[info] Provided by:
[info] {file:/Users/heiko/tmp/}default-d7f1bf/compile:main-class(for run)
...
Поэтому вы должны использовать правильную область видимости:
set mainClass in (Compile, run) := Some("Foo")
Ответ 2
Чтобы предотвратить это:
sbt> ~run
Multiple main classes detected, select one to run:
[1] com.yourapp.MainClass1
[2] com.yourapp.MainClass2
[3] com.yourapp.MainClass3
сделайте следующее:
sbt> ~run-main com.yourapp.MainClass1
Ответ 3
Если вы хотите конкретно указать основной класс для револьвера:
set mainClass in Revolver.reStart := Some("some.package.mainClass")