2011-12-23 23 views
10

我的應用程序中有6個主類,我通常只使用其中的一個,所以我想通過sbt自動運行它。 SBT使得能夠定義build.sbt兩個密鑰: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") 

而從SBT提示`顯示主級也似乎工作:

[info] Some(Main1) 

但SBT的run任務仍然提示我的主類。

此外,sbt-revolver失敗,多類合作與例外java.util.NoSuchElementException: None.get

使用SBT 0.11.2。

我在這裏做錯了什麼?

回答

12

正如你可以使用檢查看到,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") 
5

如果你想明確指定左輪手槍的主要類別:

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

什麼是確定這裏面build.sbt相當於方式/語法? – matanster 2014-07-06 12:21:04

+1

@matt mainclass in Revolver.reStart:= Some(「some.package.mainClass」) – VasyaNovikov 2014-10-27 21:25:55

+0

實際上,我切換到常規的'〜run',它在與SBT相同的JVM內運行我的應用程序,而不是單獨的應用程序...這是一個嘗試..希望左輪手槍仍然與新的斯卡拉版本 – matanster 2014-10-27 22:09:19

8

爲了防止這種情況:

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 
+0

是的。這是純粹的,而不是左輪手槍插件。 – matanster 2014-10-27 22:09:53

+8

'run-main'現在是'runMain'。 – draw 2015-07-08 03:01:33

+0

我想要的只是從SBT運行,它很快就解決了這個問題。謝謝 – aclokay 2017-06-29 12:10:54