error encontrado clase cargado scala classpath sbt

scala - encontrado - ¿Cómo ejecuto una clase principal de sbt desde el shell como el programa de línea de comandos normal?



error no se ha encontrado o cargado la clase principal eclipse java (4)

Acabo de descubrir el complemento sbt start script: https://github.com/typesafehub/xsbt-start-script-plugin :

Este complemento le permite generar un objetivo / inicio de script para un proyecto. El script ejecutará el proyecto "in situ" (sin tener que crear un paquete primero).

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

El complemento agrega una tarea start-script que genera target / start. También agrega una tarea de escenario, con alias a la tarea de inicio de script.

¿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 de scala pero sin tener que configurar un enorme classpath)?

Sé que puedo hacer:

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

Pero esto (1) toma mucho tiempo para comenzar porque comienza sbt, (2) hace que todos stdout y stderr vayan a stdout, y (3) hace que todos los resultados sean decorados con un registrador [info] 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 modificar tu archivo de proyecto para que sbt imprima el classpath sin procesar , pero creo que debe haber una mejor manera.


El plugin SBT start-script está ahora en:

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

Se requieren unos pocos pasos para configurar y generar scripts que no funcionan en OS X, pero que se pueden arreglar fácilmente si se encuentra en esa plataforma (ver a continuación).

Preparar

  1. Instala greadlink (solo OS X):

    a) brew install coreutils

    b) correlaciona el readlink a la nueva función ( g readlink) agregando estas líneas a ~ / .bashrc:

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

    export -f readlink`

  2. Agregue el plugin start-script a ~ / .sbt / plugins / build.sbt:

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

  3. Añada la tarea start-script al proyecto actual:

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

  4. Agregue soporte de inicio de script al build.sbt actual:

    import com.typesafe.sbt.SbtStartScript

    seq (SbtStartScript.startScriptForClassesSettings: _ *)

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

Generar script de inicio

Luego, cuando quiera crear un script para iniciar su aplicación como sbt run-main , pero sin sbt, ejecute:

$ sbt start-script

correr

target/start mypackage.MyMainClass


El tiempo pasa volando y muchas cosas han cambiado desde que las otras respuestas. Actualmente es SBT 0.13.6 tiempo.

Creo que lo que necesitas es el plugin sbt-onejar o el plugin SBT Native Packager .

sbt-onejar "es un complemento de herramienta de construcción simple para compilar un único JAR ejecutable que contenga todos sus códigos y dependencias como JAR anidados".

El objetivo de SBT Native Packager es poder integrar el software Scala creado con SBT para sistemas de empaquetado nativos, como Deb, rpm, homebrew, msi.


Esto es lo que tengo en mi definición de 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}" "$@" """.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 target/scala-sbt que ejecuta scala con el classpath del proyecto ya configurado. Sería bueno tener mklauncher ejecutado automáticamente cada vez que cambie la ruta de clases, pero no he buscado hacerlo todavía.

(Utilizo Java classpath, en lugar de Scala, para facilitar la creación de intérpretes integrados).