2013-04-09 10 views
63

Potresti, per favore, spiegarmi come impostare la classe principale nel progetto SBT? Sto cercando di usare la versione 0.13.come impostare la classe principale nel progetto SBT 0.13

La struttura della mia directory è molto semplice (a differenza della documentazione di SBT). Nella cartella principale ho build.sbt con i seguenti contenuti

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 

E devo sottocartella project con singolo file che contiene Hi.scala seguente codice

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

sono in grado di compilarlo chiamando sbt compile ma sbt run rendimenti

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.

Sono scioccato dal fatto che dopo aver letto la documentazione di SBT e 15 domande simili su StackOverflow, non sia stato possibile eseguire il progetto SBT. È una funzionalità di base che dovrebbe essere semplice e chiara per il cervello nei primi 10 secondi di osservazione del sito web di SBT.

PS2.

E mi piacerebbe chiedere ai dipendenti di Typesafe di migliorare la documentazione del loro prodotto invece di domande di persone che stanno investendo tempo significativo nel passaggio alla nuova piattaforma.

+0

La tua esperienza non è tipica Hai considerato se la tua build Scala non standard potrebbe essere parte del problema? –

+1

@RandallSchulz No. Perché posso compilare. Anche per motivi di esperimento ho cambiato l'impostazione SBT ottiene il compilatore Scala e rinominato il nome della classe in 'mainClass'.' Sbt run' ha funzionato comunque :) Il che indica che SBT ignora semplicemente l'impostazione. – expert

+0

Perché si utilizza SBT 0.13 (solo milestone disponibile) anziché l'ultima versione 0.12.3? Perché non usi la struttura di directory predefinita (le fonti vanno in 'src/main/scala')? Perché non usi una versione di default di Scala? –

risposta

39

È necessario inserire la sorgente dell'applicazione in src/main/scala/, project/ per codice di definizione build.

+0

Non ha aiutato. Inoltre non riesco nemmeno a compilare ora. Ottieni l'eccezione Java http://pastebin.com/MUbRQfvx – expert

+6

problema diverso, rimuovi 'autoScalaLibrary: = false' e' scalaHome: = Alcuni (file ("/ Programmi (x86)/scala /")) 'linee e set' scalaVersion: = "2.10.1" ' –

+0

Hai ragione. L'eccezione è stata causata da "autoScalaLibrary". Grazie! – expert

15

Ecco come specificare classe principale

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

+4

In realtà 'mainClass: = Some (" Hi ")' andrebbe bene, perché sbt ricadrà in ambiti più generali se non c'è un valore per una chiave in un ambito più specifico. –

+1

@HeikoSeeberger 'mainClass: = Alcuni (" Ciao ")' non funzionano in 0.12.3 se il mio progetto ha due classi con il metodo 'main'. SBT mi chiede di selezionare la classe. – expert

+4

Se stai usando scala, si aspetta anche che il 'Main' che' estende App' sia un 'oggetto'. Ero davvero stupido e questo mi ha impiccato per un po '. – BeepDog

6

Per i moduli personalizzati in SBT (0,13), basta inserire nella console SBT:

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

per passare scopo di Modulex, come definire in Built.scala. Tutte le classi principali all'interno di tale ambito verranno rilevate automaticamente. Altrimenti si ottiene lo stesso errore di nessuna classe principale rilevata. Per l'amor di Dio, SBT non ti dice che l'ambito predefinito non è impostato. Non ha nulla a che fare con le cartelle di default rispetto a quelle di default, ma solo con SBT non dice nulla che non sa quale modulo utilizzare per impostazione predefinita.

suggerimento grande per typesafe: si prega di aggiungere un output di default come:

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

alla fine di SBT comincerà a ridurre il livello di frustrazione durante l'utilizzo di SBT su progetti multi modulo .....

3

Se si dispone di più metodi principali nel progetto è possibile aggiungere la seguente riga al file build.sbt:

val projectMainClass = "com.saeed.ApplicationMain" 

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

Se si desidera specificare la classe che verrà aggiunta al manifest quando l'applicazione è pacchettizzata come file JAR, aggiungere questa riga alla build.file di SBT:

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

È inoltre possibile specificare la classe principale usando il comando run-principale di SBT e attivatore di correre:

sbt "run-main com.saeed.ApplicationMain" 

o

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

tenta di utilizzare un oggetto ed estendere da App invece che usando la classe

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

perché è necessario eseguire il metodo principale né classe principale

1

Ho avuto lo stesso problema: era la modalità seguendo il tutorial http://www.scala-sbt.org/0.13/docs/Hello.html, e, a mio parere, come un tool di creazione sbt 's messaggi di interazione e di errore può essere molto fuorviante un nuovo arrivato.

Si è scoperto, dopo ore di graffiamento della testa, che ho perso la linea critica cd hello nell'esempio ogni volta. :-(

+3

Conny, è possibile basta chiedere a me :) mi siedo Infront LOL –

+0

@PongpiraUpra Anche a me :) –

+0

@VishalJohn hahaha –

Problemi correlati