scala - ejemplos - django
Implementar binarios de Scala sin dependencias (1)
¿Existe una manera fácil de copiar un Scala Jar (~ 1MB) a un servidor y luego hacer que SBT extraiga las dependencias (~ 40MB) que necesita y ejecutarlo?
He visto sbt-onejar y sbt-assembly , pero estos agrupan todas las dependencias en un solo jar que se convierte en ~ 45MB en mi caso, lo que lleva demasiado tiempo cargarlo en el servidor.
Por el momento, utilizo Capistrano para verificar mi código de GitHub y compilarlo. Luego lo ejecuto usando el xsbt-start-script-plugin, de manera similar a como Heroku lo maneja.
El problema es que la compilación lleva mucho tiempo en los servidores (estoy usando EC2). EC2 Micro con ~ 600MB de ram toma muchísimo tiempo y en ocasiones mata al azar el proceso. Estoy usando una instancia EC2 Small (1,7 GB RAM) que está funcionando en este momento, pero a medida que aumenta la base de código y agrego más servidores, puede ser problemático.
El flujo de trabajo ideal sería compilar las fuentes de Scala localmente (o en el servidor de CI), copiar al servidor, hacer que SBT agregue dependencias adicionales desde la última compilación (las existentes vendrían del repositorio de ivy en caché local), y luego proporcionarme un simple script para ejecutar el servicio con Upstart en Ubuntu 10.04.
También me gustaría saber cómo otros usuarios de Scala implementan su código.
(código de "respuesta" publicado posteriormente por OP)
FWIW aquí están mis archivos de compilación.
build.sbt
import com.typesafe.startscript.StartScriptPlugin
name := "XXX"
version := "0.1.0"
scalaVersion := "2.9.1"
resolvers += "XXX" at "http://repo.XXX.XXX"
libraryDependencies += "XXXX" %% "backend" % "0.1.0"
seq(StartScriptPlugin.startScriptForJarSettings: _*)
mainClass in Compile := Some("XXX.app.Main")
project / build.sbt
resolvers += Classpaths.typesafeResolver
addSbtPlugin("com.typesafe.startscript" % "xsbt-start-script-plugin" % "0.5.0")
addSbtPlugin("com.eed3si9n" % "sbt-dirty-money" % "0.0.1")
Implemente su .jar en un repositorio (utilizo Artifactory , pero creo que puede publicar mediante scp en un sistema de archivos) al que puedan acceder sus servidores. Cree un proyecto sbt vacío que tenga una sola dependencia en el archivo .jar de su aplicación. sbt update
servidores pueden extraer y sbt update
el proyecto vacío para descargar los archivos sbt update
al servidor de forma que aproveche el caché Ivy local y sea muy amigable para el ancho de banda. Entonces solo se trata de obtener el classpath correcto para iniciar su aplicación.
Una cosa que debes tener en cuenta es asegurarte de que sbt realmente actualice tus dependencias. Ha habido algunas conversaciones sobre esto en la lista de correo de SBT .
Las opciones para iniciar la aplicación (en orden de aumentar la inteligencia) son:
- Solo ejecuta
sbt run
- Utilice sbt-onejar o sbt-assembly para crear un solo .jar y ejecute
java -jar
para ejecutarlo - Escriba algunos scripts de sbt para compilar el classpath y úselos para ejecutar la aplicación directamente desde el caché de Ivy.
Me parece recordar haber visto un script para hacer eso recientemente en SO, pero no puedo encontrarlo en este momento.Puede encontrar un script que haga esto en esta respuesta SO , o (como sugirió a continuación) use el xsbt-start-script-plugin .