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

×Novedad: OpenXava con IA - Refinar la UI (Parte 2) - 1 de diciembre · Leer más

Tabla de contenidos

Carga de código en caliente
Cambios soportados
Java incluido en OpenXava Studio 7 R4
IntelliJ
Visual Studio Code
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 arrancar con el Java de OpenXava Studio 7 R4.

Java incluido en OpenXava Studio 7 R4

Para que la recarga de código funcione es necesario ejecutar la aplicación con el Java incluido en OpenXava Studio 7 R4. Este Java es un JDK 11 basado en DCEVM y que integra HotswapAgent, además de estar afinado especialmente para funcionar bien con la recarga en caliente de OpenXava.
Este JDK se encuentra en la distribución de OpenXava Studio 7 R4, en openxava-studio-7-r4/studio/jre.
Si ejecutas el OpenXava Studio en una máquina limpia, sin Java, y en un workspace nuevo, lo normal es que se use este Java por defecto. Ahora bien, si ya tienes otros JDK en tu ordenador o tienes un workspace donde hayas dado de alta otros JDK, puede que tu aplicación no esté usando el JDK con HotswapAgent y por tanto no funcione la recarga de clases.
Sabrás si estás ejecutando el JDK correcto si ves estas líneas en el log al arrancar tu aplicación:
HOTSWAP AGENT: 13:40:23.126 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {1.4.1} - unlimited runtime class redefinition.
Starting HotswapAgent '/home/theuser/openxava-studio-7-r4/studio/jre/lib/hotswap/hotswap-agent.jar'
Si no es así, en OpenXava Studio, ve a Window > Preferences > Java > Installed JREs y verifica que tienes un JRE que apunta openxava-studio-7-r4/studio/jre, como ves aquí:
openxava-studio-7r4-jre.png
Si no lo hubiese, añádelo tú mismo. Además, elimina todos los demás Java 11 que tengas registrados. Prueba de nuevo ejecutar tu aplicación.
Si todavía no ejecuta el Java con HotswapAgent puede que tengas un Java 1.8 reconocido por OpenXava Studio y tu proyecto esté configurado para trabajar con Java 1.8, y por eso escoge el Java 1.8 en lugar del Java 11 (el de OpenXava Studio). Para arreglar esto ve al pom.xml de tu proyecto y cambia:
<properties>
    ...  
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
Por:
<properties>
    ...  
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>
Después con el botón derecho encima de tu proyecto escoge Maven > Update Project... Con esto ya debería funcionar.
Si quieres seguir compilando con Java 1.8 y por eso no quieres cambiar el pom.xml, no hay problema. Ve a Run Configurations:
eclipse-run-configurations.png
Busca tu aplicación y en la carpeta JRE, asegúrate de que tu aplicación se ejecuta con el JDK del OpenXava Studio:
run-configuration-jre.png
Si no es así cámbialo, quizás tengas que usar la opción Alternate JRE.

IntelliJ

También puedes disfrutar de la recarga de código en caliente usando IntelliJ. El truco es ejecutar la aplicación con el JDK incluido en OpenXava Studio 7 R4. Tendrás que descargar OpenXava Studio, aunque solo sea para usar su JDK.

Da de alta el JDK incluido en OpenXava Studio 7 R4 en tu IntelliJ. Ve a File > Project Structure. Allí en la sección SDKs añade el JDK que se encuentra en openxava-studio-7-r4/studio/jre:

intellij-openxava-studio-jdk-definition.png

Después en la sección Project, escoge este JDK como SDK para el proyecto:

intellij-openxava-studio-jdk-for-project.png

Ten en cuenta que IntelliJ no compila el código automáticamente si la aplicación se está ejecutando, por eso después de cambiar el código has de pulsar el botón de Build, el que tiene un martillito, para que compile y poder ver los cambios actualizados.

Visual Studio Code

Para usar la recarga de código en caliente con Visual Studio Code has de ejecutar la aplicación con el JDK incluido en OpenXava Studio 7 R4, por eso tendrás que descargar OpenXava Studio, aunque solo sea para usar su JDK.
Para que Visual Studio Code reconozca tu JDK en el settings.json para tu usuario añade:

"java.configuration.runtimes": [
    {
        "name": "JavaSE-11",
        "path": "/home/youruser/openxava-studio-7-r4/studio/jre",
        "default": true
    }
]

Visual Studio Code compila el código automáticamente a medida que lo editas, igual que OpenXava Studio, así que solo tienes que tocar el código e ir al navegador para ver la aplicación cambiada de forma inmediata.

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.