2013-04-09 6 views
63

Czy możecie wyjaśnić mi, jak ustawić główną klasę w projekcie SBT? Próbuję użyć wersji 0.13.jak ustawić główną klasę w projekcie SBT 0.13

Moja struktura katalogów jest bardzo prosta (w przeciwieństwie do dokumentacji SBT). W folderze głównym mam build.sbt o następującej treści

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 

I mam podfolder project z pojedynczego pliku Hi.scala który zawiera następujący kod

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

jestem w stanie skompilować go nazywając sbt compile ale sbt run powroty

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 

PS.

Jestem zszokowany, że po przeczytaniu dokumentacji SBT i 15 podobnych pytań na temat StackOverflow nie mogłem uruchomić projektu SBT. Jest to podstawowa funkcjonalność, która powinna być prosta i przejrzysta w pierwszych 10 sekundach oglądania strony internetowej SBT.

PS2.

Chciałbym poprosić pracowników Typesafe o udoskonalenie dokumentacji dotyczącej ich produktów, zamiast zgłaszać pytania osobom, które poświęcają znaczną ilość czasu na przejście na nową platformę.

+0

Twoje doświadczenie nie jest typowe. Czy zastanawiałeś się, czy twoja niestandardowa kompilacja Scali może być częścią problemu? –

+1

@RandallSchulz Nie, ponieważ mogę się skompilować, także ze względu na eksperyment zmieniłem ustawienie, aby pozwolić SBT pobiera kompilator Scala i zmienia nazwę na nazwę klasy w 'mainClass'.' Sbt run' tak czy tak działa :) Co oznacza, że ​​SBT po prostu ignoruje ustawienie. – expert

+0

Dlaczego używasz SBT 0.13 (tylko kamień milowy dostępny) zamiast najnowszego wydania 0.12.3? Dlaczego nie używasz domyślnej struktury katalogów (źródła przechodzą w 'src/main/scala')? Dlaczego nie używasz domyślnej wersji Scala? –

Odpowiedz

39

Musisz umieścić źródło swojej aplikacji pod numerem src/main/scala/, project/ dla kodu definicji kompilacji.

+0

Nie pomogło. Ponadto nie mogę nawet skompilować teraz. Uzyskaj wyjątek Java http://pastebin.com/MUbRQfvx – expert

+6

inny problem, usuń 'autoScalaLibrary: = false' &' scalaHome: = Some (file ("/ Program Files (x86)/scala /")) 'linie i ustaw' scalaVersion: = "2.10.1" ' –

+0

Masz rację. Wyjątek został spowodowany przez 'autoScalaLibrary'. Dzięki! – expert

15

Oto jak określić główne klasy

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

+4

Właściwie 'mainClass: = Some (" Hi ") również byłoby w porządku, ponieważ sbt powróci do bardziej ogólnych zakresów, jeśli nie ma wartości dla klucza w bardziej szczegółowym zakresie. –

+1

@HeikoSeeberger 'mainClass: = Some (" Hi ")' nie działa w wersji 0.12.3, jeśli mój projekt ma dwie klasy z metodą "main". SBT prosi mnie o wybranie klasy. – expert

+4

Jeśli używasz scala, oczekuje również "Main", który "rozszerza App" jako "obiekt". Byłem naprawdę głupi i to mnie powiesiło na chwilę. – BeepDog

6

przypadku niestandardowych modułów w SBT (0,13), wpisz w konsoli SBT:

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

przełączania zakresu do MODULEX, jak zdefiniuj w Built.scala. Wszystkie główne klasy w tym zakresie zostaną wykryte automatycznie. W przeciwnym razie pojawi się ten sam błąd, bez wykrycia głównej klasy. Na miłość Boską, SBT nie mówi ci, że domyślny zakres nie jest ustawiony. Nie ma to nic wspólnego z domyślnymi i nie domyślnymi folderami źródłowymi, ale tylko z SBT, który nie mówi nic, że nie wie, którego modułu użyć domyślnie.

Big Podpowiedź do typesafe: prosimy dodać domyślne wyjście jak:

[info] Project module is not set. Please use ''project moduleX'' set scope 
or set in Built file (LinkToDocu) 

na koniec SBT Start, aby obniżyć poziom frustracji podczas korzystania SBT projektów składanych wielu .....

3

Jeśli masz wiele główne metody w projekcie można dodać następującą linię do pliku build.sbt:

val projectMainClass = "com.saeed.ApplicationMain" 

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

Jeśli chcesz określić klasę, która zostanie dodana do manifestu, gdy aplikacja jest pakowana jako plik JAR, dodaj tę linię do swojej kompilacji.Plik SBT:

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

Można także określić główne klasy przy użyciu polecenia run-main w SBT i aktywator do uruchomienia:

sbt "run-main com.saeed.ApplicationMain" 

lub

activator "run-main com.saeed.ApplicationMain" 
15

spróbuje użyć obiektu i rozszerzenie to z App zamiast używać klasy

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

ponieważ trzeba uruchomić metodę głównego ani główną klasę

1

Miałem ten sam problem: czy tryb samouczka na http://www.scala-sbt.org/0.13/docs/Hello.html, i moim zdaniem, jako narzędzie budowania sbt „s komunikaty interakcji i błędów mogą być bardzo mylące nowicjusz.

Okazało się, godzinami drapania głowy później, że za każdym razem przegapiłem krytyczną linię cd hello w tym przykładzie. :-(

+3

Conny, można po prostu zapytać mnie :) Siedzę frontem ty LOL –

+0

@PongpiraUpra Nawet ja też :) –

+0

@VishalJohn hahaha –

Powiązane problemy