2011-08-20 11 views
25

Come posso eseguire un'app sbt dalla shell, in modo che possa eseguire la mia app come un normale programma da riga di comando (come se fosse eseguito direttamente tramite scala ma senza dover impostare un percorso di classe enorme)?Come si esegue una classe principale sbt dalla shell come normale programma da riga di comando?

so che posso fare:

echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt 

Ma questo (1) batte sempre per iniziare perché inizia SBT, (2) fa sì che tutti stdout e stderr di andare a stdout, e (3) fa sì che tutti output da decorare con un logger [informazioni] o [errore].

Ho guardato a https://github.com/harrah/xsbt/wiki/Launcher ma sembra troppo pesante, poiché scarica dipendenze e imposta un nuovo ambiente e quant'altro. Voglio solo eseguire questa app all'interno del mio ambiente di sviluppo esistente.

Finora ho messo insieme il mio script per creare un classpath, e puoi anche fare altre cose come modify your project file to get sbt to print the raw classpath, ma sento che ci deve essere un modo migliore.

+0

come 'mvn exec: java' o' appassembler mvn:? Assemble' – sourcedelica

risposta

9

Il start-script SBT plugin è ora a:

https://github.com/sbt/sbt-start-script

Si richiede alcuni passaggi per impostare e genera gli script che non funzionano su OS X, ma che può essere facilmente risolto se siete su quella piattaforma (vedi sotto).

Setup

  1. Installare greadlink (solo OS X):

    a) brew install coreutils

    b) mappa readlink alla nuova funzione (g readlink) aggiungendo queste righe a ~/.bashrc:

    function readlink() {greadlink "$ @"; }

    esportazione -f readlink`

  2. Aggiungere iniziare-script plugin per ~/.sbt/plugins/build.sbt:

    addSbtPlugin ("com.typesafe.sbt" % "SBT-start -script 0.8.0" % "")

  3. Aggiungi iniziare-script compito di progetto in corso:

    $ sbt add-start-script-tasks # eseguite dalla directory in cui risiede build.sbt

  4. Aggiungere start-script di supporto a build.sbt corrente:

    importazione com.typesafe.sbt.SbtStartScript

    seguenti (SbtStartScript.startScriptForClassesSettings: _ *)

Nota la riga vuota in tra le istruzioni (de rigueur per i file di build SBT).

generare Avviare Script

Poi, ogni volta che si vuole creare uno script per avviare la vostra applicazione, come sbt run-main, ma senza SBT, eseguire:

$ sbt start-script 

Run

target/start mypackage.MyMainClass 
+0

Questo plug-in è ottimo ma nella parte superiore del loro gitub dicono molto semplicemente _Consideratore-nativo-packager invece_ – tksfz

+0

@tksfz Sì, le cose sono cambiate per il meglio ... SBT Native Packager è ottimo . –

16

Ecco quello che ho nel mio SBT definizione del progetto (versione 0.10),

val Mklauncher = config("mklauncher") extend(Compile) 
    val mklauncher = TaskKey[Unit]("mklauncher") 
    val mklauncherTask = mklauncher <<= (target, fullClasspath in Runtime) map { (target, cp) => 
    def writeFile(file: File, str: String) { 
     val writer = new PrintWriter(file) 
     writer.println(str) 
     writer.close() 
    } 
    val cpString = cp.map(_.data).mkString(":") 
    val launchString = """ 
CLASSPATH="%s" 
scala -usejavacp -Djava.class.path="${CLASSPATH}" "[email protected]" 
""".format(cpString) 
    val targetFile = (target/"scala-sbt").asFile 
    writeFile(targetFile, launchString) 
    targetFile.setExecutable(true) 
    } 

    ... // remember to add mklauncherTask to Project Settings 

Il compito mklauncher crea uno script che viene eseguito target/scala-sbtscala con il percorso di classe del progetto già impostato. Sarebbe bello avere mklauncher eseguito automaticamente ogni volta che il classpath cambia, ma non ho ancora cercato di farlo.

(uso il percorso di classe Java, piuttosto che alla Scala di, per la facilità di creazione di interpreti embedded.)

+15

Al termine con fare mklauncher ricostruire ogni volta che cambia classpath (diciamo, questa notte ;-), lo trasformano in un plugin, inviarlo a GitHub e inseriscilo nella pagina dei plugin di sbt, ok? –

+0

Bump per la richiesta di Daniel ;-) – Jack

2

appena scoperto il plugin sbt script di avvio: https://github.com/typesafehub/xsbt-start-script-plugin:

Questo plugin permette di generare un script target/start per un progetto . Lo script eseguirà il progetto "sul posto" (senza doverlo prima creare un pacchetto prima) .

Lo script target/start è simile a sbt run ma non si basa su SBT. sbt run non è raccomandato per l'uso in produzione perché mantiene in memoria SBT in memoria. target/start è destinato a eseguire un'applicazione nella produzione .

Il plugin aggiunge uno script di inizio attività che genera target/inizio. Lo aggiunge anche un'attività stage, con alias sull'attività script iniziale.

9

Il tempo vola e molto sono cambiati dalle altre risposte. Attualmente è SBT 0.13.6 tempo.

Penso che quello che potrebbe essere necessario è the sbt-onejar plugin o the SBT Native Packager plugin.

SBT-onejar"è un plugin semplice-build-strumento per la costruzione di un singolo JAR eseguibile che contiene tutto il codice e le dipendenze come JAR nidificati".

SBT Native Packager s' "L'obiettivo è quello di essere in grado di impacchettare il software Scala costruita con SBT per sistemi di confezionamento nativi, come deb, rpm, homebrew, msi."

+0

packager nativo di sbt sembra il più mantenuto dei due (?). http://www.scala-sbt.org/sbt-native-packager/GettingStartedApplications/MyFirstProject.html ti fa andare relativamente in fretta nella mia umile esperienza. – matanster