comment définir la classe principale dans SBT 0.13 projet
Pourriez-vous les gars s'il vous plaît expliquez-moi comment définir la classe principale dans SBT projet ? Je suis en train d'utiliser la version 0.13.
Ma structure de répertoire est très simple (à la différence du TRIBUNAL de la documentation). 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 sous-dossier project
avec un seul fichier 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
retourne
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
- Votre expérience n'est pas typique. Avez-vous pensé que votre non-standard de Scala construire pourrait être une partie du problème?
- Nope. Parce que je peux compiler. Aussi pour le bien de l'expérience, j'ai changé le réglage de laisser SBT obtenir compilateur Scala et renommé le nom de la classe dans
mainClass
.sbt run
travaillé de toute façon 🙂 ce Qui indique que SBT simplement ignore le paramètre. - Pourquoi utilisez-vous SBT 0.13 (seule étape disponible) au lieu de la dernière version 0.12.3? Pourquoi n'utilisez-vous pas la structure de répertoires par défaut (sources d'aller dans
src/main/scala
)? Pourquoi n'utilisez-vous pas un défaut Scala version? - J'ai pris tout ce qui était plus tard sur SBT du site web. Structure de répertoire de Jeu standard Cadre du projet est différent. Je voulais à force de Jouer utiliser la dernière version de scala, au lieu de les forcer à 2.9.2. Pourriez vous s'il vous plaît upvote la question ?
- Il vous manque quelques points importants: tout d'Abord, scala-sbt.org montre 0.12.3 comme le dernier (publié) version. Deuxièmement, la Scala version sbt en interne n'est pas liée à la Scala de version pour votre projet, sauf qu'il est utilisé par défaut si vous n'avez pas défini de différentes
scalaVersion
dans votre construction. La troisième, Jouer, comme beaucoup d'autres Scala bibliothèques, est compilé avec une version spécifique de la Scala et vous devez l'utiliser (ou binaire compatible mise à niveau). Quatrièmement, je suis exclusivement agissant en mon nom propre ici. - Les problèmes décrits dans la présente question n'étaient pas liées à la version alpha. Mais bien essayé.
- projet de répertoire contient la définition de build, et non de votre projet classes, comme cela est expliqué dans scala-sbt.org/0.13.0/docs/Getting-Started/Full-Def.html
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de mettre votre application source dans
src/main/scala/
,project/
est pour construire la définition de code.autoScalaLibrary := false
&scalaHome := Some(file("/Program Files (x86)/scala/"))
lignes et de définirscalaVersion := "2.10.1"
autoScalaLibrary
. Merci!Essayez d'utiliser un objet et de l'étendre à partir de l'App au lieu de l'aide de la classe
parce que vous avez besoin pour exécuter la méthode main ni la classe principale
Ici est de savoir comment spécifier la classe principale de
mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")
mainClass := Some("Hi")
serait aussi bien, parce que sbt reviendra plus générales étendues si il n'y a pas de valeur pour une clé en plus de la portée spécifique.main
méthode. SBT me demande de sélectionner la classe.Main
queextends App
être unobject
. J'ai été vraiment stupide et ce moi accroché un peu.Pour les modules personnalisés en SBT (0.13), il suffit d'entrer sur le TRIBUNAL de la console:
pour passer portée de moduleX, de définir les Construit dans.scala. Toutes les principales classes au sein de ce champ sera automatiquement détectée. Sinon vous obtenez le même message d'erreur de pas de classe principale détecté.
Pour l'amour de Dieu, SBT ne vous dis pas que l'étendue par défaut n'est pas définie. Il n'a rien à voir avec les valeurs par défaut et non par défaut les dossiers de la source, mais seulement avec SBT ne dit pas tout ce qu'il ne sait pas quel module utiliser par défaut.
Gros Soupçon de typesafe: s'il vous PLAÎT ajouter une sortie par défaut comme:
à la fin de SBT commencer à abaisser le niveau de frustration tout en utilisant SBT sur les projets de module.....
Si vous disposez de plusieurs méthodes principales dans votre projet, vous pouvez ajouter la ligne suivante à votre construction.sbt fichier:
Si vous souhaitez spécifier la classe qui sera ajouté à le manifeste lorsque votre application est disponible sous forme d'un fichier JAR, ajoutez cette ligne à votre construction.sbt fichier:
Vous pouvez également spécifier la classe principale à l'aide d'exécution de commande principale, dans sbt et activateur pour exécuter:
ou
J'ai eu le même problème: a mode en suivant le tutoriel à http://www.scala-sbt.org/0.13/docs/Hello.html, et à mon avis, comme un outil de construction
sbt
s'interaction et les messages d'erreur peut être assez trompeur pour un nouveau venu.Il s'est avéré, les heures de casse-tête plus tard, que j'ai raté la critique
cd hello
ligne dans l'exemple à chaque fois. 🙁Il y a 4 options
vous avez 1 classe principale
sbt run
et sbt trouverez principal pour vousvous avez 2 ou plusieurs classes principales
sbt run
et sbt proposera de sélectionner celui que vous souhaitez exécuter.Vous souhaitez définir la classe principale manuellement.
Vous pouvez exécuter avec classe principale en tant que paramètre
Si la classe Principale est dans un autre projet, puis par le réglage de la commande ci-dessous dans
build.sbt
devrait fonctionner: