Saltar al contenido principal

Hotswap 26.02

Abrir en ChatGPT

Una herramienta de hotswap aplica los cambios de clases compiladas a la aplicación en ejecución sin reiniciarla. La aplicación conserva su estado entre actualizaciones. La herramienta se especifica en la configuración del complemento de compilación de webforJ y se conecta cuando la compilación inicia la aplicación. El comando de ejecución no cambia y el proyecto no declara ninguna dependencia para la herramienta.

Se admiten dos herramientas:

  • HotswapAgent es de código abierto. El complemento de compilación descarga el agente en la primera ejecución y lo guarda en caché.
  • JRebel es un producto comercial. Requiere una instalación y una licencia propias.

Configura exactamente una. Si una compilación especifica ambas, falla con un error que las menciona.

HotswapAgent​

Un elemento vacío es una configuración completa:

pom.xml
<plugin>
<groupId>com.webforj</groupId>
<artifactId>webforj-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<hotswap>
<hotswapAgent/>
</hotswap>
</configuration>
</plugin>

Dos opciones permiten ajustar la conexión:

OpciónDescripción
versionUna versión específica del agente, en lugar de la que selecciona el complemento.
pathUn archivo jar del agente en el disco, que se usa directamente sin descargarlo. Para máquinas sin acceso a la red o para una compilación personalizada del agente.
pom.xml
<hotswap>
<hotswapAgent>
<path>/path/to/hotswap-agent.jar</path>
</hotswapAgent>
</hotswap>

Cambios en la estructura de las clases​

Las modificaciones del cuerpo de un método se aplican en cualquier máquina virtual Java. Los cambios en la estructura de una clase, como añadir un campo o un método, requieren una máquina virtual que acepte la opción -XX:+AllowEnhancedClassRedefinition, disponible en JetBrains Runtime. La compilación detecta esta capacidad y la activa. Consulta Requisitos previos para instalar JetBrains Runtime.

Sin esta capacidad, las modificaciones del cuerpo de los métodos siguen aplicándose, pero los cambios en la estructura de una clase no llegan a la aplicación en ejecución hasta que se reinicia. El registro de compilación muestra una advertencia que indica el requisito, y el navegador muestra un aviso una vez.

JRebel​

JRebel es un producto comercial cuya licencia concede su proveedor. webforJ no lo incluye ni lo descarga, y no interviene en la concesión de licencias. La compilación lee la ruta configurada, comprueba que el archivo exista y lo conecta sin modificarlo.

Configura la ruta del agente de tu instalación de JRebel, ya sea una biblioteca nativa o un archivo jar:

pom.xml
<hotswap>
<jrebel>
<path>/path/to/libjrebel64.dylib</path>
</jrebel>
</hotswap>

La ruta es obligatoria. Si una compilación selecciona JRebel sin especificarla, falla con un error que indica cuál es el ajuste que falta.

Con JRebel, todos los cambios de clases, incluidos los cambios en su estructura, se aplican en cualquier entorno de ejecución de Java.

Selección desde la línea de comandos​

La propiedad webforj.hotswap prevalece sobre el archivo de compilación durante una sola ejecución. Los valores aceptados son hotswapAgent, jrebel y off. Cualquier otro valor hace que falle la compilación con un error que enumera los valores válidos. Si se selecciona jrebel, sigue siendo necesario especificar la ruta del agente en la configuración.

mvn -Dwebforj.hotswap=off
mvn -Dwebforj.hotswap=hotswapAgent

Aplicar un cambio​

Al compilar un cambio, este llega a la aplicación en ejecución. Guarda los cambios en un IDE que compile al guardar o ejecuta una compilación en una segunda terminal.

Si todas las clases modificadas forman parte de lo que muestra la página actual, se vuelve a crear la parte afectada sin cambiar de lugar y se conserva el estado de la aplicación. De lo contrario, la página se recarga por completo: si la aplicación no tiene enrutamiento, si una clase está fuera de las rutas mostradas o si no se puede llevar a cabo la reconstrucción. Cada cambio compilado produce una actualización en el navegador.

Acelerar las recargas en IntelliJ IDEA​

IntelliJ IDEA solo compila al guardar si están habilitadas las compilaciones automáticas, y espera antes de cada paso. Reduce las esperas para que los cambios lleguen antes a la aplicación en ejecución.

Habilitar las compilaciones automáticas​

Abre los ajustes y activa estas opciones:

  1. En Build, Execution, Deployment > Compiler, activa Build project automatically.
  1. En Advanced Settings > Compiler, activa Allow auto-make to start even if developed application is currently running.
  1. En Appearance & Behavior > System Settings, en Autosave, activa Save files if the IDE is idle for y establece el valor en 1 segundo.

Pulsa Ctrl+ALt+S o selecciona File > Settings.

Reducir las demoras de compilación​

Establece estas claves del Registro en 0:

ClaveDescripción
compiler.automake.trigger.delayLa demora entre un cambio en un archivo y el inicio de una compilación.
compiler.automake.build.while.idle.timeoutEl tiempo de inactividad que debe transcurrir antes de que se inicie una compilación.
compiler.automake.postpone.when.idle.less.thanEl tiempo de inactividad por debajo del cual IntelliJ IDEA pospone una compilación.
  1. Pulsa Ctrl+Shift+A para abrir Find Action.
  2. Escribe Registry... y selecciónalo.

También puedes pulsar Shift dos veces para abrir Search Everywhere, cambiar a la pestaña Actions y escribir Registry.

En el cuadro de diálogo Registry, escribe el nombre de una clave para filtrar la lista y, a continuación, establece su valor en 0.

advertencia

Las entradas del Registro son ajustes avanzados de IntelliJ IDEA que no cuentan con soporte. Selecciona Restore Defaults en el cuadro de diálogo Registry para restablecerlas.

Sigue aprendiendo