Hotswapping en Java
En el proyecto actual -una aplicación web JEE / jdk1.5 construida fundamentalmente con portlets, jsf(myfaces, tomahawk) y ejb3 que se despliega sobre JBoss Portal Server- en el que estamos colaborando nos hemos encontrado con un problema, que aunque puede que habitual en algunas ocasiones, nos está afectando en nuestras tareas de desarrollo y despliegue.
Concretamente, el problema es el tiempo que requieren las tareas de compilación, generación del archivo de despliegue (actualmente ocupa 120 megas) y el propio arranque del servidor de aplicaciones. Después de algunas “optimizaciones”, dichas tareas nos pueden llevar de 3 a 5 minutos, así que os podéis imaginar lo frustante que puede ser cuando, después de invertir ese tiempo, tratas de testear los últimos cambios que has realizado y te encuentras con un error tonto como que olvidaste negar la condición pusiste en un if o algo así… y tienes que volver a repetir todo el ciclo…
Tratando de solucionar este problema, probamos el Hotswapping (recarga de “clases” en caliente, es decir, sin necesidad de reinicar el servidor) nativo que ofrece el jdk pero, por desgracia, no conseguimos hacerlo funcionar correctamente (no tengo muy claro donde estaba el problema si en los frameworks o en el servidor de aplicaciones…) así que le dimos otra vuelta más por google y encontramos un JavaRebel:producto de pago :(, con versión de evaluación de 30 días y licencias gratuitas para desarrollos open source, que la verdad funciona bastante bien… En nuestro caso concreto pasamos de tener que construir todo el proyecto y desplegarlo (unos 3-5 minutos) a simplemente compilar las clases modificadas (10-15 segundos).
Básicamente, lo que ofrece JavaRebel es la modificación “casi completa” del bytecode “on the fly”. Aquí podéis ver una comparación con la fucionalidad ofrecida por JavaRebel frente a la ofrecida por los jdk’s actuales.
| Sun JVM HotSwap | JavaRebel | |
| Cambios en el cuerpo de los métodos | SI | SI |
| Añadir / eliminar métodos | NO | SI |
| Añadir / eliminar constructores | NO | SI |
| Añadir / eliminar atributos | NO | SI |
| Añadir / Eliminar Clases | NO | SI |
| Añadir / Eliminar anotaciones | NO | SI |
| Cambios en interfaces | NO | SI |
| Cambiar la clase padre | NO | NO |
| Añadir / Eliminar interfaces implementadas | NO | NO |
Bueno, y que hay que hacer para utilizarlo? Pues simplemente hay que descargarse el jar de JavaRebel y luego incluir -javaagent:/path/to/javarebel.jar en el arranque. (El tema de javaagent da al menos para otro post, pero básicamente es un “interceptor” del proceso de carga de clases, que permite monitorizar dicho proceso de carga y modificar el bytecode que se va a ejecutar… Esta funcionalidad es utilizada por algunas herramientas de profiling o frameworks de Programación Orientada a Aspectos)
En la propia página del producto podéis encontrar un flash que describe bastante bien nuestra situación inicial y también hay una demo real de como funciona esto…
Una de las cosas no tan buenas, además del problemita de ser de pago, es que no es posible depurar desde Netbeans (tienen identificado el bug pero de momento no han previsto cuando liberarán esa versión…) En cuanto a otros IDEs funciona correctamente para Eclipse y para IDEA IntelliJ.
Tags: Hotswapping, Java