2011-12-23 18 views
10

Mam ~ 6 głównych klas w mojej aplikacji, przez zwykle używam tylko jednego z nich, więc chciałem uruchomić go automatycznie przez sbt. SBT pozwala zdefiniować dwa klucze w build.sbt:sbt: wybór głównej klasy do uruchomienia

// 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.") 

więc zdefiniowano je (przykładowy projekt, dwie klasy - Main1 & main2 w głównym katalogu źródłowym):

mainClass := Some("Main1") 

selectMainClass := Some("Main1") 

I `pokazać main-class' z wiersza SBT również wydaje się działać:

[info] Some(Main1) 

Ale SBT za run zadanie nadal skłania mnie do głównej klasy.

Również sbt-revolver nie działa z wieloma klasami z wyjątkiem java.util.NoSuchElementException: None.get

Korzystanie SBT 0.11.2.

Co ja tu robię źle?

Odpowiedz

12

Jak widać z użyciem skontrolować, mainClass jest zawężona do różnych konfiguracji i zadań:

> 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) 
... 

Dlatego trzeba użyć odpowiedniego scopingu:

set mainClass in (Compile, run) := Some("Foo") 
5

jeśli chcesz Aby określić główną klasę dla rewolweru konkretnie:

set mainClass in Revolver.reStart := Some("some.package.mainClass") 
+0

Jaki byłby równoważny sposób/składnia definiowania tego wewnątrz build.sbt? – matanster

+1

@matt mainClass w Revolver.reStart: = Some ("some.package.mainClass") – VasyaNovikov

+0

Właściwie przełączyłem się na zwykły '~ run', który uruchamia moją aplikację w tej samej JVM co SBT, a nie jako oddzielny ... da to próba .. rewolwer nadziei wciąż działa z nowymi wersjami Scala – matanster

8

Aby temu zapobiec:

sbt> ~run 

Multiple main classes detected, select one to run: 

[1] com.yourapp.MainClass1 
[2] com.yourapp.MainClass2 
[3] com.yourapp.MainClass3  

to zrobić:

sbt> ~run-main com.yourapp.MainClass1 
+0

Tak. dotyczy to zwykłego sbt, a nie wtyczki rewolwerowej. – matanster

+8

'run-main' jest teraz' runMain' teraz. – draw

+0

Wszystko, czego chciałem, to uruchomić z SBT i szybko rozwiązałem problem. dzięki – aclokay

Powiązane problemy