openxava / documentación / Carga de código en caliente

×Novedad: XavaPro 7.7.3 disponible - 10 de junio · Leer más

Tabla de contenidos

Carga de código en caliente
Cambios soportados
IntelliJ
Sin IDE
Otros IDE
OpenXava Studio y Java 11
Rendimiento
Classpaths extra
XavaPro
A partir de OpenXava 7.5 puedes disfrutar de la recarga en caliente de código mientras desarrollas tu aplicación. Esto quiere decir que puedes tocar cualquier parte del código, grabar, ir al navegador y ver la aplicación actualizada. Todo instantáneo, sin necesidad de hacer un build, Maven install, reiniciar la aplicación, ni siquiera recargar la página en el navegador.

Cambios soportados

Estos son los cambios que puedes hacer en tu aplicación sin reiniciarla. La mayoría son efectivos sin ni siquiera recargar la página del navegador:

No es necesario arrancar en modo debug para que se reconozcan los cambios, pero sí que hay que usar un JDK de JetBrains con el agente HotSwap configurado y arrancando con ciertas opciones, como se explica más abajo.

IntelliJ

IntelliJ es el IDE recomendado para la recarga de código en caliente con OpenXava. Para usarlo es necesario un JDK de JetBrains: JBR 17, 21 o 25. Usa la opción Project Structure... de IntelliJ para establecer uno de estos JDK para el proyecto:

jbr-17-in-intellij.png

Si no tienes un JDK de JetBrains puedes descargarlo desde el propio IntelliJ en Project Structure..., en la sección SDKs:

download-jbr-intellij.png

Además, hay que instalar un plugin llamado HotSwapHelper. Ve a Settings > Plugins y búscalo:

hotswaphelper-intellij-plugin.png

Con esto ya se puede ejecutar la aplicación, pero no de la forma habitual. Hay que usar la opción run with Hotswap debug que ahora tenemos disponible en el menú de ejecución de IntelliJ:

run-with-hotswap-plugin.png

Si todo va bien, en la salida del log, al principio, debería haber un mensaje como este:

Connected to the target VM, address: '127.0.0.1:54715', transport: 'socket'
HOTSWAP AGENT: 12:30:48.070 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {2.0.2} - unlimited runtime class redefinition.

Si es así, ya se puede cambiar el código y ver el efecto de forma inmediata. Ten en cuenta que IntelliJ no compila el código automáticamente, incluso aunque marques la opción de compilar el código automáticamente (porque esa opción no funciona cuando la aplicación esta en marcha). Lo que ocurrirá es que al cambiar el código, aparecerá un botón en el editor de código de IntelliJ que indica 'Code changed', púlsalo para compilar y recargar el código:

Botón 'Code changed' dentro del editor de código de IntelliJ

A veces no aparece el botón, por ejemplo si cambias un archivo XML o el código Java lo genera un asistente IA. En ese caso, pulsa Ctrl + F9. Esto compilará y recargará el código cambiado.

Con Java 25 la aplicación se para de vez en cuando, con Java 21 falla mucho menos y con Java 17 no falla. Aun así es mucho más práctico que reiniciar la aplicación por cada cambio. Lo normal es que a medida que salgan nuevas versiones de mantenimiento de Java 25 sea cada vez más robusto.

Sin IDE

También se puede usar la recarga de clases en caliente fuera de IntelliJ y sin usar ningún IDE, desde el terminal.

Para ello hay que descargar un JDK de JetBrains, que se puede hacer desde aquí: https://github.com/JetBrains/JetBrainsRuntime/releases

Después de instalar el JDK de JetBrains, dentro de la carpeta lib hay que crear una carpeta hotswap y copiar dentro un archivo hotswap-agent.jar, sin número de versión. Este jar se puede descargar desde aquí: https://github.com/HotswapProjects/HotswapAgent/releases
Importante: al copiarlo dentro de lib/hotswap hay que renombrarlo para que se llame solo hotswap-agent.jar.

Ahora solo hay que arrancar la aplicación con este JDK enviando unas opciones de arranque para activar el HotSwap.

Por ejemplo, en Linux:

export MAVEN_OPTS="-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar"
export JAVA_HOME=/home/javi/.jdks/jbr-25.0.2
export PATH=$JAVA_HOME/bin:$PATH
mvn exec:java

En Windows:

set MAVEN_OPTS=-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar
set JAVA_HOME=C:\Users\youruser\.jdks\jbr-25.0.2
set PATH=%JAVA_HOME%\bin;%PATH%
mvn exec:java

Si se hace bien, al ejecutar la aplicación deberíamos ver:

Connected to the target VM, address: '127.0.0.1:54715', transport: 'socket'
HOTSWAP AGENT: 12:30:48.070 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {2.0.3} - unlimited runtime class redefinition.

Para más información ver: https://github.com/HotswapProjects/HotswapAgent

Otros IDE

La recarga de clases en caliente puede funcionar desde cualquier IDE, como Eclipse, NetBeans o Visual Studio Code. Solo hay que usar un JDK de JetBrains y copiarle el hotswap-agent.jar como se describe en la sección Sin IDE. Además, hay que configurar el arranque de la aplicación en el IDE para que use las opciones -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar.

OpenXava Studio y Java 11

Si queremos usar OpenXava Studio o Java 11 debemos seguir la siguiente documentación: Carga de código en caliente con OpenXava Studio / Java 11.

Rendimiento

El mecanismo de recarga en caliente está diseñado para un rendimiento óptimo, cargando los metadatos justos únicamente cuando es necesario o reiniciando la sesión de Hibernate solo cuando se modifica la parte persistente de alguna entidad. Además, en producción donde usas un JDK diferente al de desarrollo, el mecanismo de recarga está desactivado.

Classpaths extra

A veces estás desarrollando una librería o un proyecto que es una dependencia del proyecto actual, y te gustaría que cuando cambias el código de la librería también ver los resultado en caliente. Para este caso puede arrancar tu aplicación indicando un lista de classpaths extra. Edita tu clase lanzadora y escribe algo así:

public static void main(String[] args) throws Exception {
    AppServer.run("yourapp", "../yourlib/target/classes"); 
}

Ahora cuando se cambie algo en ../yourlib/target/classes también se recargará automáticamente. Esto te permite desarrollar tu librería probándola en una aplicación final, con la misma agilidad que con cualquier otra aplicación.

El indicar classpaths extra al arrancar la aplicación está disponible desde la versión 7.5.

XavaPro

En XavaPro 7.5, hay mejoras significativas respecto a la disponibilidad de módulos durante el desarrollo. Cuando se usa carga de código en caliente:

Esto agiliza el proceso de desarrollo, ya que ya no es necesario añadir manualmente los nuevos módulos al rol "user" para tenerlos disponibles. Sin embargo, en entornos de producción (donde no se usa Hotswap Agent), el comportamiento sigue siendo el mismo por motivos de seguridad: los nuevos módulos deben asignarse explícitamente a un rol para estar disponibles para los usuarios.