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
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.
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
Voici comment spécifier la classe principale
mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")
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 .....
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"
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. :-(
vous avez 1 classe principale
sbt run
et sbt trouveront le principal pour vousvous 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:
Vous voulez définir la classe principale manuellement.
mainClass in run := Some("a.b.DummyMain1")
Vous pouvez exécuter avec la classe principale en paramètre
sbt runMain a.b.DummyMain1
Si la classe Main est dans un projet différent, définissez la commande ci-dessous dans build.sbt
:
addCommandAlias("run", "; project_folder/run")