Scalive es una herramienta de código abierto diseñada para adjuntar una consola REPL de Scala a un proceso JVM en ejecución sin necesidad de preconfiguración en el proceso de destino. Permite a los desarrolladores interactuar con un JVM activo, ejecutar código e incluso realizar modificaciones dinámicas sin interrumpir la operación del programa.
Funcionalidades Principales
- Carga automática de bibliotecas Scala que coinciden con la versión utilizada por el proceso JVM de destino.
- Soporte para historial de comandos (teclas de flecha arriba/abajo) y autocompletado (tecla Tab) en el REPL.
- Capacidad para incorporar archivos JAR personalizados en el proceso de destino.
Inicio Rápido
Descarga e Instalación
Obtén el paquete de Scalive desde su repositorio en GitHub. Asegúrate de descargar la versión de Scalive que sea compatible con la versión de Scala que usa tu proceso JVM objetivo.
# Ejemplo: Descargar la versión 1.7.0 de Scalive
wget https://github.com/xitrum-framework/scalive/releases/download/v1.7.0/scalive-1.7.0.zip
Extrae el archivo descargado y navega al directorio resultante:
unzip scalive-1.7.0.zip
cd scalive-1.7.0
Iniciando Scalive
Ejecuta el script de Scalive desde el directorio extraído para listar los procesos JVM activos en tu máquina:
./scalive
La salida será similar a:
JVM processes:
#pid Display name
13821 demos.Boot
17978 quickstart.Boot
Conexión a un Proceso JVM
Selecciona el ID del proceso (PID) al que deseas conectarte y ejecútalo con Scalive:
./scalive 13821
Una vez conectado exitosamente, accederás a un entorno REPL de Scala listo para interactuar con el proceso JVM.
Incorporación de JARs Personalizados
Si necesitas usar clases de un JAR personalizado dentro del REPL, puedes cagrarlo de la siguiente manera:
val classLoader = ClassLoader.getSystemClassLoader.asInstanceOf[java.net.URLClassLoader]
val searchDirectories = Array("/ruta/al/directorio/con/el/jar")
val jarIdentifier = "mi-libreria" // Prefijo para buscar "mi-libreria-*.jar"
scalive.Classpath.findAndAddJar(classLoader, searchDirectories, jarIdentifier)
Después de la carga, podrás importar y usar las clases de tu JAR:
import mi.libreria.paquete.ClaseEjemplo
Casos de Uso y Buenas Prácticas
Depuración en Caliente
Scalive es ideal para depurar procesos JVM en producción. Permite adjuntarse a una instancia en ejecución para ejecutar código dinámicamente, lo que facilita el diagnóstico de problemas sin necesidad de detener la aplicación.
Modificación Dinámica de Código
En escenarios donde se requiere ajustar el comportamiento de una aplicación en ejecución, Scalive facilita la ejecución de código en el REPL para realizar estas modificaciones sin reiniciar el sistema.
Monitorización de Rendimiento
Es posible utilizar Scalive para obtener métricas de rendimiento en tiempo real de un proceso JVM. Ejecutar fragmentos de código de prueba puede ayudar a evaluar tiempos de respuesta y uso de recursos.
Proyectos Relacionados en el Ecosistema
Play Framework
Como framework web popular para Scala y Java, Scalive puede integrarse con aplicaciones Play para facilitar la depuración y las modificaciones en tiempo de ejecución.
Xitrum
Este framework web de alto rendimiento para Scala se beneficia de Scalive para la depuración y optimización, especialmente en entornos de producción.
Akka
Para la construcción de sistemas concurrentes y distribuidos con Akka, Scalive ofrece una vía para monitorizar y depurar aplicaciones, particularmente al gestionar flujos de mensajes y estados complejos.
Scalive mejora significativamente la eficiencia en la depuración y la capacidad de modificación dinámica de código, contribuyendo a una mayor productividad y estabilidad de las aplicaciones.