Festlegen der Hauptklasse im SBT 0.13-Projekt

77

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.sbtfolgenden 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 projectmit einer einzelnen Datei, Hi.scaladie folgenden Code enthält

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

Ich kann es kompilieren, indem ich aufrufe, sbt compileaber sbt runzurü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
Experte
quelle
Ihre Erfahrung ist nicht typisch. Haben Sie darüber nachgedacht, ob Ihr nicht standardmäßiger Scala-Build Teil des Problems sein könnte?
Randall Schulz
2
@ RandallSchulz Nein. Weil ich kompilieren kann. Aus Versuchsgründen habe ich die Einstellung geändert, damit SBT den Scala-Compiler erhält und den Namen der Klasse in umbenennt mainClass. sbt runhat trotzdem funktioniert :) Was darauf hinweist, dass SBT die Einstellung einfach ignoriert.
Experte
4
@HeikoSeeberger Ich habe alles genommen, was auf der SBT-Website aktuell war. Die Verzeichnisstruktur des Standard-Play Framework-Projekts ist unterschiedlich. Ich wollte Play zwingen, die neueste Version von Scala zu verwenden, anstatt auf 2.9.2 zu zwingen. Könnten Sie bitte die Frage positiv bewerten?
Experte
1
Ihnen fehlen einige wichtige Punkte: Erstens zeigt scala-sbt.org 0.12.3 als neueste (veröffentlichte) Version. Zweitens ist die Scala-Version, die sbt intern verwendet, nicht mit der Scala-Version für Ihr Projekt verbunden, außer dass sie als Standard verwendet wird, wenn Sie scalaVersionin 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.
Heiko Seeberger
1
@ HeikoSeeberger Die in dieser Frage beschriebenen Probleme betrafen nicht die Alpha-Version. Aber netter Versuch.
Experte

Antworten:

50

Sie müssen die Quelle Ihrer Anwendung eingeben src/main/scala/, project/um den Build-Definitionscode zu erhalten.

Jed Wesley-Smith
quelle
Hat nicht geholfen. Außerdem kann ich jetzt noch nicht einmal kompilieren. Holen Sie sich Java-Ausnahme pastebin.com/MUbRQfvx
Experte
6
anderes Problem, entfernen autoScalaLibrary := false& scalaHome := Some(file("/Program Files (x86)/scala/"))Linien und setzenscalaVersion := "2.10.1"
Jed Wesley-Smith
Du hast recht. Ausnahme wurde verursacht durch autoScalaLibrary. Vielen Dank!
Experte
24

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")
}
Artem Ignatiev
quelle
16

Hier erfahren Sie, wie Sie die Hauptklasse angeben

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

Experte
quelle
4
Eigentlich 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.
Heiko Seeberger
1
@ HeikoSeeberger mainClass := Some("Hi")funktioniert in 0.12.3 nicht, wenn mein Projekt zwei Klassen mit mainMethode hat. SBT bittet mich, die Klasse auszuwählen.
Experte
4
Wenn Sie Scala verwenden, wird auch erwartet, Maindass extends Appdies eine ist object. Ich war wirklich dumm und das hat mich ein bisschen aufgehängt.
BeepDog
2
Ich habe auch mehrere Hauptklassen, ausführbare Anwendungen, in meinem Projekt, aber ich führe wiederholt nur eine über einen längeren Zeitraum aus. Die Vorauswahl ist sehr nützlich. Ich habe dies in meine buid.sbt-Datei eingefügt: mainClass in (Kompilieren, Ausführen): = Some ("my.home.z033.rngtest.RngTest1") ..und es hat perfekt funktioniert. Verkürzte Variante von: mainClass: = Einige ("my.home.z033.rngtest.RngTest1") funktionierten nicht für mich (sbt 0.13.1)
Espinosa
6

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.

Marvin.Hansen
quelle
3

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"
Saeed Zarinfam
quelle
3

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 sbtkönnen die Interaktions- und Fehlermeldungen eines Build-Tools durchaus sein irreführend zu einem Neuling.

Stundenlanges Kopfkratzen stellte sich heraus, dass ich cd hellojedes Mal die kritische Linie im Beispiel verfehlte . :-(

conny
quelle
6
Conny, du kannst mich einfach fragen :) Ich sitze vor dir LOL
Sam Upra
1
@ PongpiraUpra Auch ich auch :)
Vishal John
1
@ VishalJohn hahaha
Sam Upra
Unglaublich, danke, dass Sie Ihre Antwort geschrieben haben!
Mohit6up
1

Es gibt 4 Möglichkeiten

  1. Sie haben 1 Hauptklasse

    • sbt run und sbt wird main für dich finden
  2. Sie 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:

  1. Sie möchten die Hauptklasse manuell festlegen.

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

    sbt runMain a.b.DummyMain1
    
Sergii Shevchyk
quelle
1

Wenn sich die Hauptklasse in einem anderen Projekt befindet, build.sbtfunktioniert das Setzen des folgenden Befehls in :

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

Ich hatte das gleiche Problem. Es wurde nach dem Hinzufügen des PlayMinimalJavaPlugins behoben build.sbt.

Nicht sicher, wie es behoben wurde, wenn jemand hervorheben kann, wie es PlayMinimalJavagelöst wird, wäre großartig.

enablePlugins(PlayMinimalJava)

Mein build.sbtsieht so aus

organization := "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)
kulsin
quelle