Könntet ihr mir bitte erklären, wie man die Hauptklasse im SBT-Projekt einstellt? Ich versuche Version 0.13 zu verwenden.
Meine Verzeichnisstruktur ist sehr einfach (im Gegensatz zur Dokumentation von SBT). Im Stammordner habe ich build.sbt
folgenden Inhalt
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
Und ich habe einen Unterordner project
mit einer einzelnen Datei, Hi.scala
die folgenden Code enthält
object Hi {
def main(args: Array[String]) = println("Hi!")
}
Ich kann es kompilieren, indem ich aufrufe, sbt compile
aber sbt run
zurückkehre
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
mainClass
.sbt run
hat trotzdem funktioniert :) Was darauf hinweist, dass SBT die Einstellung einfach ignoriert.scalaVersion
in Ihrem Build keine andere festlegen . Drittens wird Play wie viele andere Scala-Bibliotheken für eine bestimmte Version von Scala kompiliert, und Sie müssen diese (oder ein binär kompatibles Upgrade) verwenden. Viertens handele ich hier ausschließlich in meinem eigenen Namen.Antworten:
Sie müssen die Quelle Ihrer Anwendung eingeben
src/main/scala/
,project/
um den Build-Definitionscode zu erhalten.quelle
autoScalaLibrary := false
&scalaHome := Some(file("/Program Files (x86)/scala/"))
Linien und setzenscalaVersion := "2.10.1"
autoScalaLibrary
. Vielen Dank!Versuchen Sie, ein Objekt zu verwenden und es aus der App zu erweitern, anstatt eine Klasse zu verwenden
object Main extends App { println("Hello from main scala object") }
quelle
Hier erfahren Sie, wie Sie die Hauptklasse angeben
mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")
quelle
mainClass := Some("Hi")
wäre das auch in Ordnung, da sbt auf allgemeinere Bereiche zurückgreifen wird, wenn es keinen Wert für einen Schlüssel in einem spezifischeren Bereich gibt.mainClass := Some("Hi")
funktioniert in 0.12.3 nicht, wenn mein Projekt zwei Klassen mitmain
Methode hat. SBT bittet mich, die Klasse auszuwählen.Main
dassextends App
dies eine istobject
. Ich war wirklich dumm und das hat mich ein bisschen aufgehängt.Für benutzerdefinierte Module in SBT (0.13) geben Sie einfach in die SBT-Konsole ein:
project moduleX [info] Set current project to moduleX (in build file:/path/to/Projects/) > run [info] Running main
um den Bereich auf moduleX umzuschalten, wie in Built.scala definiert. Alle Hauptklassen in diesem Bereich werden automatisch erkannt. Andernfalls wird der gleiche Fehler angezeigt, dass keine Hauptklasse erkannt wurde. Um Gottes willen sagt SBT Ihnen nicht, dass der Standardbereich nicht festgelegt ist. Es hat nichts mit Standard- oder Nicht-Standard-Quellordnern zu tun, sondern nur damit, dass SBT nichts sagt, dass es nicht weiß, welches Modul standardmäßig verwendet werden soll.
Großer Hinweis zu typsicher : BITTE fügen Sie eine Standardausgabe hinzu wie:
[info] Project module is not set. Please use ''project moduleX'' set scope or set in Built file (LinkToDocu)
Beginnen Sie am Ende von SBT, die Frustration zu verringern, während Sie SBT in Projekten mit mehreren Modulen verwenden.
quelle
Wenn Ihr Projekt mehrere Hauptmethoden enthält, können Sie Ihrer build.sbt-Datei die folgende Zeile hinzufügen:
val projectMainClass = "com.saeed.ApplicationMain" mainClass in (Compile, run) := Some(projectMainClass)
Wenn Sie die Klasse angeben möchten, die dem Manifest hinzugefügt wird, wenn Ihre Anwendung als JAR-Datei gepackt wird, fügen Sie diese Zeile Ihrer build.sbt-Datei hinzu:
mainClass in (Compile, packageBin) := Some(projectMainClass)
Sie können die Hauptklasse auch mit dem Befehl run-main in sbt und dem Aktivator angeben, der ausgeführt werden soll:
sbt "run-main com.saeed.ApplicationMain"
oder
activator "run-main com.saeed.ApplicationMain"
quelle
Ich hatte das gleiche Problem: War der Modus nach dem Tutorial unter http://www.scala-sbt.org/0.13/docs/Hello.html , und meiner Meinung nach
sbt
können die Interaktions- und Fehlermeldungen eines Build-Tools durchaus sein irreführend zu einem Neuling.Stundenlanges Kopfkratzen stellte sich heraus, dass ich
cd hello
jedes Mal die kritische Linie im Beispiel verfehlte . :-(quelle
Es gibt 4 Möglichkeiten
Sie haben 1 Hauptklasse
sbt run
und sbt wird main für dich findenSie haben 2 oder mehr Hauptklassen
sbt run
und sbt schlägt vor, auszuwählen, welche Sie ausführen möchten.Multiple main classes detected, select one to run: [1] a.b.DummyMain1 [2] a.b.DummyMain2 Enter number:
Sie möchten die Hauptklasse manuell festlegen.
mainClass in run := Some("a.b.DummyMain1")
Sie können mit der Hauptklasse als Parameter ausgeführt werden
sbt runMain a.b.DummyMain1
quelle
Wenn sich die Hauptklasse in einem anderen Projekt befindet,
build.sbt
funktioniert das Setzen des folgenden Befehls in :addCommandAlias("run", "; project_folder/run")
quelle
Ich hatte das gleiche Problem. Es wurde nach dem Hinzufügen des
PlayMinimalJava
Plugins behobenbuild.sbt
.Nicht sicher, wie es behoben wurde, wenn jemand hervorheben kann, wie es
PlayMinimalJava
gelöst wird, wäre großartig.enablePlugins(PlayMinimalJava)
Mein
build.sbt
sieht so ausorganization := "org" version := "1.0-SNAPSHOT" scalaVersion := "2.13.1" libraryDependencies += guice enablePlugins(PlayMinimalJava)
Log
C:\Users\KulwantSingh\repository\pdfdemo>sbt run Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 [info] Loading settings for project pdfdemo-build from plugins.sbt ... [info] Loading project definition from C:\Users\KulwantSingh\repository\pdfdemo\project [info] Loading settings for project pdfdemo from build.sbt ... [info] Set current project to pdfdemo (in build file:/C:/Users/KulwantSingh/repository/pdfdemo/) [warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings. --- (Running the application, auto-reloading is enabled) --- [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 (Server started, use Enter to stop and go back to the console...) [info] Compiling 6 Scala sources and 2 Java sources to C:\Users\KulwantSingh\repository\pdfdemo\target\scala-2.13\classes ... [info] p.a.h.EnabledFilters - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>): play.filters.csrf.CSRFFilter play.filters.headers.SecurityHeadersFilter play.filters.hosts.AllowedHostsFilter [info] play.api.Play - Application started (Dev) (no global state)
quelle