2011-08-20 3 views
25

¿Cómo puedo ejecutar una aplicación sbt desde el shell, para que pueda ejecutar mi aplicación como un programa normal de línea de comandos (como si se ejecutara directamente a través del scala pero sin tener que configurar un enorme classpath)?¿Cómo ejecuto una clase principal de sbt desde el shell como el programa de línea de comandos normal?

Sé que puedo hacer:

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

Pero esto (1) necesita siempre para empezar, ya que comienza SBT, (2) hace que todo stdout y stderr para ir a la salida estándar, y (3) que a todos salida que se decorará con un registrador [información] o [error].

Miré https://github.com/harrah/xsbt/wiki/Launcher pero parece demasiado pesado, ya que descarga dependencias y configura un nuevo entorno y otras cosas. Solo quiero ejecutar esta aplicación dentro de mi entorno de desarrollo existente.

Hasta ahora he improvisado mi propio script para construir un classpath, y también puedes hacer otras cosas como modify your project file to get sbt to print the raw classpath, pero creo que debe haber una forma mejor.

+0

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

Respuesta

9

El start-script SBT plugin es ahora en:

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

Se requiere unos pocos pasos para configurar y genera secuencias de comandos que no funcionan en OS X, pero que se puede fijar fácilmente si estás en esa plataforma (ver a continuación).

Configuración

  1. Instalar greadlink (OS X):

    a) brew install coreutils

    b) mapa readlink a la nueva función (g readlink) mediante la adición de estas líneas a ~/.bashrc:

    función readlink() {greadlink "$ @"; }

    exportación -f readlink`

  2. Añadir puesta en secuencia de comandos Plugin a ~/.sbt/plugins/build.sbt:

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

  3. Añadir puesta en secuencia de comandos de tareas de proyecto actual:

    $ sbt add-start-script-tasks # ejecutan desde el directorio donde reside build.sbt

  4. Añadir puesta en secuencia de comandos de apoyo a build.sbt actual:

    com.typesafe.sbt.SbtStartScript importación

    SEQ (SbtStartScript.startScriptForClassesSettings: _ *)

Nota en blanco en la línea de entre declaraciones (de rigor para archivos de compilación SBT).

Generar script de arranque de

Entonces, cada vez que desee crear una secuencia de comandos para iniciar su aplicación como sbt run-main, pero sin SBT, ejecute:

$ sbt start-script 

Run

target/start mypackage.MyMainClass 
+0

Ese plugin es genial, pero en la parte superior de su github dicen muy claramente _Considere sbt-native-packager en su lugar_ – tksfz

+0

@tksfz Sí, las cosas han cambiado para mejor ... SBT Native Packager es genial . –

16

Esto es lo que tengo en la definición del proyecto SBT (versión 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 

La tarea mklauncher crea un script que ejecuta target/scala-sbtscala con la ruta de clase del proyecto ya establecido. Sería bueno tener mklauncher ejecutado automáticamente cada vez que la ruta de clase cambia, pero no he investigado para hacer esto todavía.

(yo uso la ruta de clases de Java, en lugar de Scala, para facilitar la creación de intérpretes embebidos.)

+15

Cuando termine con la fabricación de mklauncher reconstrucción siempre que cambie la ruta de clases (digamos, esta noche ;-), lo convierten en un plugin, enviarlo a GitHub y ponerlo en la página de plugins sbt, ¿de acuerdo? –

+0

Bump para la solicitud de Daniel ;-) – Jack

2

Acaba de ser descubierto el plugin SBT script de inicio: https://github.com/typesafehub/xsbt-start-script-plugin:

Este plugin le permite generar una script target/start para un proyecto . La secuencia de comandos ejecutará el proyecto "in situ" (sin tener que crear primero un paquete).

El script de inicio/destino es similar a sbt pero no se basa en SBT. sbt run no se recomienda para uso en producción porque mantiene SBT en sí en la memoria. target/start está destinado a ejecutar una aplicación en la producción .

El complemento agrega una tarea start-script que genera target/start. Es también agrega una tarea de etapa, alias a la tarea de inicio de secuencia de comandos.

9

El tiempo vuela por y mucho han cambiado desde las otras respuestas. Actualmente es SBT 0.13.6 vez.

Creo que lo que necesita es the sbt-onejar plugin o the SBT Native Packager plugin.

SBT-onejar"es un plugin-build-herramienta sencilla para la construcción de un único ejecutable JAR que contiene todo el código y dependencias como frascos anidados."

SBT nativo empaquetador 's "El objetivo es ser capaz de vincular el software de Scala construido con SBT para sistemas de envasado nativos, como deb, rpm, homebrew, msi."

+0

sbt native packager se ve como el más mantenido fuera de los dos (?). http://www.scala-sbt.org/sbt-native-packager/GettingStartedApplications/MyFirstProject.html te lleva relativamente rápido en mi humilde experiencia. – matanster

Cuestiones relacionadas