sbt:选择要运行的主类

时间:2011-12-23 05:38:54

标签: scala 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") 

来自sbt提示符的`show main-class'似乎也有效:

[info] Some(Main1)

但是sbt的run任务仍然提示我上大班。

此外,sbt-revolver无法使用异常java.util.NoSuchElementException: None.get

的多个类

使用sbt 0.11.2。

我在这里做错了什么?

4 个答案:

答案 0 :(得分:13)

从使用 inspect 可以看出, 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")

答案 1 :(得分:13)

为了防止这种情况:

sbt> ~run

Multiple main classes detected, select one to run:

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

这样做:

sbt> ~runMain com.yourapp.MainClass1

答案 2 :(得分:5)

如果您想特别为左轮手枪指定一个主类:

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

答案 3 :(得分:2)

oneline console:

sbt "run-main com.path.to.MainClass"