2011-12-23 13 views
10

Tengo ~ 6 clases principales en mi aplicación, por lo general uso solo una de ellas, así que quería ejecutarla automáticamente por sbt. SBT hace que sea posible definir dos llaves en build.sbt:sbt: seleccionando la clase principal para ejecutar

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

así que les define (proyecto de ejemplo, dos clases - Principal1 & Main2 en la raíz del directorio de fuentes):

mainClass := Some("Main1") 

selectMainClass := Some("Main1") 

Y 'show principal de clase desde el indicador de SBT también parece funcionar:

[info] Some(Main1) 

Pero la tarea de SBT run todavía me lleva a la clase principal.

Además, sbt-revolver no puede trabajar con múltiples clases con excepción java.util.NoSuchElementException: None.get

Usando SBT 0.11.2.

¿Qué estoy haciendo mal aquí?

Respuesta

12

Como se puede ver en el uso de inspeccionar, MainClass está en el ámbito de diversas configuraciones y tareas:

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

Por lo tanto usted tiene que utilizar de alcance adecuado:

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

Si desea para especificar específicamente una clase principal para el revólver:

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

¿Cuál sería el equivalente forma/sintaxis de la definición de este build.sbt dentro? – matanster

+1

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

+0

En realidad cambié a '~ run' normal, que ejecuta mi aplicación dentro de la misma JVM que SBT, no como una aplicación separada ... dará esto es un intento ... espero que el revólver aún funcione con las nuevas versiones de Scala – matanster

8

Para evitar esto:

sbt> ~run 

Multiple main classes detected, select one to run: 

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

hacer esto:

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

Sí. esto es para sbt simple, no para el plugin revolver. – matanster

+8

'run-main' es' runMain' ahora. – draw

+0

Todo lo que quería era ejecutar desde SBT y resolvió rápidamente el problema. Gracias – aclokay

Cuestiones relacionadas