×Novedad:
OpenXava con IA - Refinar la UI (Parte 2) -
1 de diciembre ·
Leer más
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.
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:
- Código Java: Agregar, eliminar o modificar campos, métodos,
anotaciones, clases (incluidas anónimas), miembros estáticos y valores
de enumeraciones. Se gestionan correctamente la redefinición de clases
anónimas y la inicialización de miembros estáticos.
- Propiedades calculadas: Puedes añadir, eliminar o modificar una
propiedad calculada en una entidad y aparecerá inmediatamente en la
aplicación, tanto en modo lista como en modo detalle.
- Anotaciones de OpenXava: Si cambias, añades o quitas anotaciones de
OpenXava como @View, @DescriptionsList o @Tab también
verás el efecto inmediatamente.
- Propiedades persistentes: Al añadir, modificar o quitar una propiedad
persistente a una entidad, se verá inmediatamente en la interfaz de
usuario, en modo detalle y modo lista. Además, si tenemos la evolución
de esquema activada, se creará la columna correspondiente en la tabla
de la base de datos.
- Entidades nuevas: Si creas una nueva clase y la anotas con
@Entity, no solo se reconocerá sino que habrá automáticamente un
nuevo módulo disponible (en el menú de la izquierda y mediante URL).
Si tenemos la evolución de esquema activada se creará la tabla en la
base de datos. En este caso hay que pulsar el botón de recargar en el
navegador para ver el nuevo módulo.
- Controladores: Si añadimos o quitamos controladores en
controladores.xml, añadimos, modificamos o cambiamos acciones
en un controlador, etc. Todo se reconoce inmediatamente, apareciendo
(o desapareciendo las acciones) nada más pulsemos una acción en la
interfaz de usuario.
- Aplicación: Podemos añadir, modificar y quitar módulos en aplicacion.xml.
Los nuevos módulos se ven después de pulsar recargar en el navegador.
- Etiquetas y mensajes: Si cambiamos las etiquetas y mensajes en los
archivos i18n, también tiene efecto sin reiniciar la aplicación.
Aunque en este caso hay que pulsar recargar en el navegador, para ver
las nuevas etiquetas.
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í:
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:
Busca tu aplicación y en la
carpeta JRE, asegúrate de que tu aplicación se ejecuta con el JDK del OpenXava
Studio:
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:
Después en la sección Project, escoge este JDK como SDK para
el proyecto:
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.
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:
- Cuando añades un nuevo módulo a una aplicación XavaPro, ya sea definiéndolo en aplicacion.xml o creando una nueva entidad JPA,
el módulo aparece inmediatamente en el menú, en la carpeta raíz.
- El nuevo módulo se asigna automáticamente al rol "user", si este rol existe.
- De manera similar, si arrancas la aplicación con el JDK que incluye Hotswap Agent (el incluido en OpenXava Studio 7 R4),
cualquier módulo añadido mientras la aplicación estaba parada será reconocido cuando la aplicación arranque.
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.