webentwicklung-frage-antwort-db.com.de

so legen Sie die Hauptklasse im SBT 0.13-Projekt fest

Könnten Sie mir bitte erklären, wie Sie die Hauptklasse im SBT-Projekt einstellen können? Ich versuche Version 0.13 zu verwenden.

Meine Verzeichnisstruktur ist sehr einfach (im Gegensatz zur SBT-Dokumentation). Im Stammordner habe ich build.sbt mit folgendem 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 sbt compile aufrufe, aber sbt run zurückgibt

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

Sie müssen den Quellcode Ihrer Anwendung in src/main/scala/ eingeben, project/ ist für Builddefinitionscode.

44

Versuchen Sie, ein Objekt zu verwenden und es von App zu erweitern, anstatt Klasse zu verwenden

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

weil Sie Hauptmethode oder Hauptklasse nicht ausführen müssen

21

Hier erfahren Sie, wie Sie die Hauptklasse angeben

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

16
expert

Geben Sie für benutzerdefinierte Module in SBT (0,13) einfach auf der SBT-Konsole Folgendes ein: 

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

um den Bereich auf moduleX umzustellen, wie in Built.scala definiert. Alle Hauptklassen innerhalb dieses Bereichs werden automatisch erkannt. Andernfalls erhalten Sie den gleichen Fehler, wenn keine Hauptklasse erkannt wird. Um Himmels willen sagt SBT nicht, dass der Standardbereich nicht festgelegt ist. Es hat nichts mit Standard- oder Nicht-Standard-Quellordnern zu tun, sondern nur, wenn SBT nichts sagt, dass es nicht weiß, welches Modul standardmäßig verwendet wird. 

Großer Hinweis zu Typesafe : 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)  

am Ende von SBT beginnen Sie mit der Verwendung von SBT bei Multi-Modul-Projekten, um den Frustgrad zu senken. 

6
Marvin.Hansen

Wenn Sie mehrere Hauptmethoden in Ihrem Projekt haben, 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 der Datei build.sbt hinzu:

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

Sie können auch die Hauptklasse angeben, indem Sie den Befehl run-main in sbt verwenden und den Aktivator ausführen:

sbt "run-main com.saeed.ApplicationMain"

oder

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

Ich hatte das gleiche Problem: Der Modus folgte dem Tutorial unter http://www.scala-sbt.org/0.13/docs/Hello.html und meiner Meinung nach als Interaktions- und Fehlermeldungen des Build-Tools sbt kann für einen Neuankömmling durchaus irreführend sein.

Es stellte sich heraus, dass sich Stunden später der Kopf verkratzte, dass ich die kritische Zeile cd hello in diesem Beispiel jedes Mal verpasste. :-(

1
conny

Es gibt 4 Optionen

  1. du hast 1 Hauptklasse

    • sbt run und sbt finden für Sie die wichtigsten Informationen
  2. sie haben 2 oder mehr Hauptunterricht

    • sbt run und sbt schlagen vor zu wählen, welchen Sie ausführen möchten.

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

  1. Sie möchten die Hauptklasse manuell einstellen.

    mainClass in run := Some("a.b.DummyMain1")
    
  2. Sie können mit der Hauptklasse als Parameter ausführen

    sbt runMain a.b.DummyMain1
    
0
Sergii Shevchyk

Wenn sich die Main-Klasse in einem anderen Projekt befindet, funktioniert das Festlegen des folgenden Befehls in build.sbt:

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