web-dev-qa-db-fra.com

comment définir la classe principale dans le projet SBT 0.13

Pourriez-vous m'expliquer comment définir la classe principale dans le projet SBT? J'essaie d'utiliser la version 0.13.

La structure de mon répertoire est très simple (contrairement à la documentation de SBT). Dans le dossier racine, j'ai build.sbt avec le contenu suivant

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

Et j'ai le sous-dossier project avec le fichier unique Hi.scala qui contient le code suivant

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

Je suis capable de le compiler en appelant sbt compile mais sbt run renvoie

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
72
expert

Vous devez indiquer le code source de votre application dans src/main/scala/, project/ étant destiné au code de définition de génération.

44
Jed Wesley-Smith

Essayez d'utiliser un objet et de l'étendre depuis App au lieu d'utiliser class

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

parce que vous devez exécuter la méthode principale ni la classe principale

21
Artem Nachtigall

Voici comment spécifier la classe principale

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

16
expert

Pour les modules personnalisés dans SBT (0.13), entrez simplement sur la console SBT: 

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

pour basculer la portée vers moduleX, comme défini dans Built.scala. Toutes les classes principales de cette étendue seront détectées automatiquement. Sinon, vous obtenez la même erreur sans classe principale détectée. Pour l'amour de Dieu, SBT ne vous dit pas que la portée par défaut n'est pas définie. Cela n'a rien à voir avec les dossiers source par défaut ou non, mais seulement avec SBT qui ne dit pas qu'il ne sait pas quel module utiliser par défaut. 

Big Hint to typesafe : VEUILLEZ ajouter une sortie par défaut comme:

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

à la fin de SBT, commencez à réduire le niveau de frustration lorsque vous utilisez SBT sur des projets multi-modules ..... 

6
Marvin.Hansen

Si vous avez plusieurs méthodes principales dans votre projet, vous pouvez ajouter la ligne suivante à votre fichier build.sbt:

val projectMainClass = "com.saeed.ApplicationMain"

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

Si vous souhaitez spécifier la classe qui sera ajoutée au manifeste lorsque votre application est packagée en tant que fichier JAR, ajoutez cette ligne à votre fichier build.sbt:

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

Vous pouvez également spécifier la classe principale à l'aide de la commande run-main dans sbt et d'un activateur pour exécuter:

sbt "run-main com.saeed.ApplicationMain"

ou

activator "run-main com.saeed.ApplicationMain"
3
Saeed Zarinfam

J'avais le même problème: le mode suivait-il le didacticiel à l'adresse http://www.scala-sbt.org/0.13/docs/Hello.html , et à mon avis, en tant qu'outil de construction, les interactions et les messages d'erreur de sbt peut être assez trompeur pour un nouveau venu.

Il s'est avéré, des heures plus tard, que j'ai raté la ligne critique cd hello dans l'exemple à chaque fois. :-(

1
conny

Il y a 4 options

  1. vous avez 1 classe principale

    • sbt run et sbt trouveront le principal pour vous
  2. vous avez 2 classes principales ou plus

    • sbt run et sbt proposeront de sélectionner celui que vous voulez exécuter.

Multiple main classes detected, select one to run:
[1] a.b.DummyMain1
[2] a.b.DummyMain2
Enter number:

  1. Vous voulez définir la classe principale manuellement.

    mainClass in run := Some("a.b.DummyMain1")
    
  2. Vous pouvez exécuter avec la classe principale en paramètre

    sbt runMain a.b.DummyMain1
    
0
Sergii Shevchyk

Si la classe Main est dans un projet différent, définissez la commande ci-dessous dans build.sbt:

addCommandAlias("run", "; project_folder/run")
0
Langdon