cómo configurar la clase principal en el proyecto SBT 0.13


¿Podrían explicarme cómo configurar la clase principal en el proyecto SBT? Estoy tratando de usar la versión 0.13.

Mi estructura de directorios es muy simple (a diferencia de la documentación de SBT). En la carpeta raíz tengo build.sbt con el siguiente contenido

name := "sbt_test"

version := "1.0"

scalaVersion := "2.10.1-local"

autoScalaLibrary := false

scalaHome := Some(file("/Program Files (x86)/scala/"))

mainClass := Some("Hi")

libraryDependencies ++= Seq(
    "org.scalatest" % "scalatest_2.10" % "2.0.M5b" % "test"
)

EclipseKeys.withSource := true

Y tengo una subcarpeta project con un solo archivo Hi.scala que contiene el siguiente código

object Hi {
  def main(args: Array[String]) = println("Hi!")
}

Puedo compilarlo llamando a sbt compile pero sbt run devuelve

The system cannot find the file C:\work\externals\sbt\bin\sbtconfig.txt.
[info] Loading project definition from C:\work\test_projects\sbt_test\project
[info] Set current project to sbt_test (in build file:/C:/work/test_projects/sbt_test/)
java.lang.RuntimeException: No main class detected.
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Apr 8, 2013 6:14:41 PM

PS.

Estoy sorprendido de que después de leer SBT documentación y 15 preguntas similares sobre StackOverflow No pude hacer que se ejecutara el proyecto SBT. Es una funcionalidad básica que debería ser simple y clara en los primeros 10 segundos de mirar el sitio web de SBT.

PS2.

Y me gustaría pedir a los empleados de Typesafe que mejoren la documentación de su producto en lugar de rechazar las preguntas de las personas que están invirtiendo mucho tiempo en cambiar a una nueva plataforma.

 68
Author: expert, 2013-04-09

6 answers

Debe poner la fuente de su aplicación en src/main/scala/, project/ es para construir código de definición.

 43
Author: Jed Wesley-Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-09 01:22:07

Intenta usar un objeto y extenderlo desde App en lugar de usar class

object Main extends App {
  println("Hello from main scala object")
}

Porque necesita ejecutar el método principal ni la clase principal

 17
Author: Artem Ignatiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-07 07:14:02

Aquí es cómo especificar la clase principal

mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")

 15
Author: expert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-01 23:18:41

Para módulos personalizados en SBT (0.13), simplemente ingrese en la consola SBT:

 project moduleX
 [info] Set current project to moduleX (in build file:/path/to/Projects/)
 >   run
 [info] Running main 

Para cambiar el ámbito a moduleX, como se define en Built.scala. Todas las clases principales dentro de ese ámbito se detectarán automáticamente. De lo contrario se obtiene el mismo error de ninguna clase principal detectado. Por el amor de Dios, SBT no le dice que el alcance predeterminado no está establecido. No tiene nada que ver con carpetas de origen predeterminadas versus no predeterminadas, pero solo con SBT no diciendo nada que no sepa qué módulo usar predeterminado.

Gran sugerencia para typesafe : Por favor, agregue una salida predeterminada como:

[info] Project module is not set. Please use ''project moduleX''  set scope 
or set in Built file (LinkToDocu)  

Al final de SBT comience a reducir el nivel de frustración mientras usa SBT en proyectos de módulos múltiples.....

 6
Author: Marvin.Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-25 06:02:57

Si tiene varios métodos principales en su proyecto, puede agregar la siguiente línea a su compilación.archivo sbt:

val projectMainClass = "com.saeed.ApplicationMain"

mainClass in (Compile, run) := Some(projectMainClass)

Si desea especificar la clase que se agregará al manifiesto cuando su aplicación se empaquete como un archivo JAR, agregue esta línea a su compilación.archivo sbt:

mainClass in (Compile, packageBin) := Some(projectMainClass)

También puede especificar la clase main usando el comando run-main en sbt y activator para ejecutar:

sbt "run-main com.saeed.ApplicationMain"

O

activator "run-main com.saeed.ApplicationMain"
 3
Author: Saeed Zarinfam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-13 06:01:01

Tuve el mismo problema: era modo siguiendo el tutorial en http://www.scala-sbt.org/0.13/docs/Hello.html , y en mi opinión, como herramienta de compilación, la interacción y los mensajes de error de sbt pueden ser bastante engañosos para un recién llegado.

Resultó que, horas después de rascarme la cabeza, me perdí la línea crítica cd hello en el ejemplo cada vez. :-(

 1
Author: conny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 06:40:46