java grails groovy playframework hotdeploy

java - ¿Cómo detectan Grails o Play los cambios y las clases de recarga en caliente?



groovy playframework (1)

Play lo hace utilizando el JDT de Eclipse para compilar el código en tiempo de ejecución.

Eche un vistazo a la siguiente clase, que Play utiliza para realizar la compilación necesaria en el tiempo de ejecución.

https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationCompiler.java

Además, solo para notar la diferencia entre el modo DEV y el modo PROD en Play. Esta es una decisión de diseño tomada por los desarrolladores de Play de que una vez que una aplicación se pone en el modo de producción, las clases se compilan cuando se inicia el servidor y no se verifica la recarga en caliente. Esto tiene sentido porque en el modo PROD, su código no debería estar cambiando realmente.

En el modo DEV, los archivos de Java se verifican en busca de actualizaciones cada vez que se recibe una nueva solicitud, y los archivos modificados se compilan automáticamente (y los errores se muestran directamente en los navegadores). Este proceso es muy productivo en el modo DEV, ya que cambiará el código con frecuencia y la respuesta inmediata es muy poderosa.

Tengo curiosidad, ¿alguien sabe los detalles sobre cómo los marcos como Grails o Play detectan cambios en el código y activan automáticamente una recompilación sin reiniciar el servidor de aplicaciones? ¿Hay algo específico para el compilador de Groovy o su naturaleza dinámica que permita que esto suceda fácilmente?

Para el fondo, tengo una etapa de generación de código personalizado durante mi proceso de compilación que me encantaría poder tener capacidades similares de edición y actualización.

Gracias de antemano por cualquier puntero, incluso si tengo que revisar el código para obtener una imagen más grande.

Edit: Debería aclarar que no estoy buscando construir un plugin de Grails sino comprender lo que se necesita para hacer esto en cualquier aplicación en un contenedor de servlets. Es decir, estoy usando Groovy pero no Grails.

Edit2: Parece que Play tiene un modo DEV específico que permite esta recarga en caliente: http://www.playframework.org/documentation/1.1.1/main#lifecycle

Entiendo que JRebel realiza versiones elaboradas de la clase a través de los cargadores de clases, pero supongo que los marcos web como Grails o Play no lo están llevando a ese nivel.