Imagine a bacon-wrapped Ferrari. Still not better than our free technical reports.
See all our reports

Desarrollando en Java con JRebel

Resumen

Para aquellos que tengan poco tiempo, este post muestra las formas en que JRebel, el asesino de los redeploys en Java, ha impactado en el día a día de los programadores. Con JRebel, los desarrolladores pueden ver los cambios realizados en el código inmediatamente, ajustar el código con cambios incrementales, debugar, explorar y desplegar con facilidad (local y remotamente), y finalmente, pasar más tiempo aprendiendo y comunicándose con compañeros en vez de esperar a que el despliegue de la aplicación acabe.

N.B. Para más información, puedes consultar la página de ayuda: Instalando y usando JRebel en Eclipse IDE & Tomcat

Instalando y usando JRebel en Eclipse IDE con Tomcat

Introducción

El veneno de Java ha sido siempre la dependencia en herramientas. Si todo lo que tuviéramos para escribir código fuera un bloc de notas y un compilador de línea de comandos, hubiera considerado gratamente una carrera en limpieza de calles, recolección de fruta o guitarrista de metro.

Pero tenemos un puñado de IDEs modernos. También tenemos un gran ecosistema que nos ofrece increíbles librerías de código abierto y servidores de aplicaciones. Y desde que tenemos JRebel, ya no tenemos que esperar que la aplicación se despliegue leyendo toda la serie de novelas de Harry Potter en una semana después de haber corregido un error tipográfico, y todo para descubrir que hay otro más.

Este post muestra algunas de las grandes ventajas de usar JRebel en el desarrollo Java, así como los efectos duraderos en la manera de escribir código derivados de la eliminación del proceso diario y lento de desplegar la aplicación para ver los cambios.

Java cambiado para siempre #1: Cambios de forma inmediata

¿A qué huele tu código? Averígualo rápidamente y ejecuta tus propios mini-tests durante el día. Elimina el mal código antes que vaya a control de calidad y se rían de ti.

Con JRebel, puedes ver los cambios inmediatamente después de compilarlos. Cuando el IDE compila las clases automáticamente, el proceso es tan rápido como el uso de un lenguaje de scripting o probar los cambios más recientes de un HTML. De hecho, te propongo probar de compilar el siguiente fragmento de código, arrancándolo con JRebel habilitado, y cambiar el literal “Hello World” por otra cosa mientras el programa está en ejecución. Puedes descargar JRebel aquí: http://zeroturnaround.com/jrebel/current/

<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestLoop <span style="color: #009900;">{</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">(</span><span style="color: #003399;">String</span>... <span style="color: #006633;">args</span><span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">{</span>
   <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
     saySomething<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
     <span style="color: #003399;">Thread</span>.<span style="color: #006633;">sleep</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">1000</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">}</span>
 <span style="color: #009900;">}</span>
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> saySomething<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
   <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"Hello World"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>

La salida por consola después del logo de JRebel es (si, escribo rápido):

Hello World
Hello World
Hello World
JRebel: Reloading class 'TestLoop'.
Goodbye Redeploys
Goodbye Redeploys

Esto abre un mundo de posibilidades que nunca antes había estado disponible a los programadores. Combina la potencia de Java con el rápido tiempo de respuesta de los lenguajes dinámicos de scripting. Puedes desarrollar haciendo pequeños cambios incrementales y saltar al navegador para verificar los resultados.

Java cambiado para siempre #2: Refinando a través de cambios incrementales

Esto funciona mejor cuando tienes que implementar lógica difícil. Imagina que tienes que añadir validación a un formulario. Con JRebel, puedes añadir las reglas campo por campo y jugar con la manera de mostrar los errores hasta que los resultados sean satisfactorios. Es posible que quieras añadir nuevos campos a tu controlador o validador. Esto también está soportado. JRebel mantiene todo el estado de la aplicación, con lo que no importa cómo has llegado a la página que se está modificando.

JRebel en realidad va mucho más allá de la “simple” recarga de clases. Las aplicaciones actuales utilizan frameworks y tecnologías JEE, como EJBs, Hibernate, Spring Framework, JSF, Seam, Struts, etc. Lo que pasa con estos frameworks y tecnologías es que se inicializan cuando la aplicación arranca, generando gran cantidad de metadatos. Esto es bueno en general, nadie querría que Hibernate se reinicializara en cada petición HTTP (esto es lo que hacen las aplicaciones PHP, incluso cuando tienen el opcode caching activado).

JRebel lo ha afrontado teniendo soporte explícito para casi 60 frameworks populares y contenedores de aplicaciones. Esto significa que cuando se realiza cambios a un recurso “especial”, como añadir un nuevo EJB, cambiar los mappings JPA (en xml o anotaciones), o añadir un nuevo bean en Spring (nuevamente, en xml o anotaciones), JRebel actualiza los metadatos para reflejar esos cambios. Tu trabajo es simplemente presionar F5 en el navegador.

Java cambiado para siempre #3: Debugar remotamente

Debugar remotamente es más útil que nunca con JRebel. Imagina que estás buscando un error complicado. Ahora puedes parar en un breakpoint, hacer un cambio, continuar con la ejecución y ver los resultados de manera casi inmediata!

El código nuevo se activa inmediatamente después de compilarlo, la próxima vez cuando el método afectado se invoca. Puedes utilizar esta aproximación para corregir bugs que hayas encontrado o para añadir sentencias de debug rápidamente en el código (recuerda no hacer commit de éstas).

Java cambiado para siempre #4: Explora el código con facilidad

Uno de los beneficios de un tiempo de respuesta pequeño es que podemos probar las características de un framework interactivamente. Podemos escribir un pequeño método para probar una funcionalidad de un nuevo framework y aprender como funciona. Python y Scala tienen incluso consolas interactivas.

El problema aquí es la aplicabilidad en el mundo real. Mientras que explorar la API de librerías Java es fácil (incluso cuando no tienen documentación), puede ser muy tedioso en otros lenguajes, especialmente cuando son dinámicos, sin documentación y/o sin un buen soporte por parte del IDE.

El pequeño tiempo de respuesta de PHP y similares, tiene poco valor cuando tienes que destripar algún framework grande y oscuro (como Joomla CMS) para ver cómo funciona. La posibilidad de hacer ctrl-click para adentrarse en el código, así cómo tener autocompletado sería fantástico, si estuvieran en estos casos. Hay soporte para ello en algún IDE moderno, pero no es tan útil. La diferencia está en el orden de magnitud.

Java, por otro parte, sufre del hecho que mientras el código de terceros es fácilmente navegable, escribir stubs y ejecutarlos puede ser lento y tedioso. Escribir tests en isolación requiere un esfuerzo de configuración y no son exactamente un substituto de un caso de uso real.

Añadir código de test a una aplicación existente es simple y fácil, pero reiniciar el servidor o volver a desplegar la aplicación para ver los cambios requiere tiempo…a no ser que uses JRebel para eliminar la necesidad de reiniciar…

Java cambiado para siempre #5: Desplegar código localmente o remotamente

Es genial cuando un desarrollador puede ver código desde un repositorio, compilarlo y desplegarlo en su propia máquina. A veces esto no es posible.

Puede ser por razones de rendimiento, o que todo el sistema sea demasiado complejo. A veces, el sistema tiene que ejecutarse en una red diferente a la del desarrollador, cosa que no se puede simular fácilmente. Algunos desarrolladores pueden estar utilizando portátiles con poca potencia. Cualquier que sea la razón, a veces ejecutar la aplicación en la misma máquina no es una opción.

Casi puedo oír llorar a desarrolladores (yo incluido) en estas situaciones. JRebel puede ayudar en estos casos haciendo que la capacidad de desplegar el sistema en un entorno local no sea crucial.

JRebel Remoting (beta) se introdujo en la versión 4.6, la cual permite enviar cambios de la máquina del desarrollador a un servidor remoto. Funciona a través de HTTP en el mismo puerto que el servidor está sirviendo la aplicación, por eso, casi no necesita configuración y ningún cambio en la configuración del firewall. En el screencast (ver el último enlace), mostramos JRebel Remoting en acción cuando se despliega en Amazon EC2, por lo que si funciona bien lejos en la nube, seguro que funciona en tu red o en la otra punta de la ciudad.

Diferentes desarrolladores pueden incluso interactuar independientemente con la misma instancia de aplicación en un servidor remoto (pero no simultáneamente). Por defecto, JRebel Remoting vuelve al código inicial cuando se reinicia el servidor. Puedes configurar una aplicación en una máquina remota, dejar que un desarrollador haga sus cambios, reiniciar (ok, hay un reinicio, perdón), y dejar a otro desarrollador hacer su magia a la aplicación. Este es el escenario en el que ambos desarrolladores hacen cambios a la misma aplicación. Cuando hay diferentes aplicaciones desplegadas en el servidor remoto, los desarrolladores pueden bombardearlas sin pisarse los pies el uno al otro.

Java cambiado para siempre #6: No reinicios = Más tiempo para mejores coses

No reinicios significa no interrupciones forzadas, lo que significa que los desarrolladores tienen más tiempo para hacer mejores cosas. A veces es difícil mantener la concentración en una tarea más de unos minutos, y es ahí cuando el nivel de focalización depende de uno mismo. Si hubiera un payaso de circo saltando desde detrás de un puerta cada 6 minutos para asustarme, no podría imaginar trabajar debidamente durante el día.

Con JRebel, tendrás más tiempo para cumplir con los plazos de entrega, investigar, aprender y comunicarte minimamente con otra gente. Según un reciente informe en Developer Stress, los desarrolladores se preocupan por cumplir con los plazos de entrega y de su nivel de experiencia, deseando tener más tiempo para dedicar a la educación.

En un post relacionado, también descubrimos que por cada hora dedicada a escribir código, un desarrollador dedica 30 minutos en comunicación (ej. reuniones, charlas, informes / justificaciones de tiempo, etc). La magia de recarga de clases inmediata de JRebel libera más tiempo para hacer cosas a las que los desarrolladores ya dedican tiempo.

Palabras finales

JRebel ofrece lo mejor de los dos mundos – el rendimiento, escalabilidad y robustez de Java, así como el rápido tiempo de respuesta y la sensación de ligereza, que se asocian típicamente con aplicaciones de libros de visitas de 100 líneas, no con sistemas grandes y madures. JRebel se comporta como si estuviera en Roma – no tienes que hacer cambios en el código, arquitectura o sistema. Se adapta al entorno y requerimientos. Todo lo que tienes que hacer es empezar a usarlo. Puedes mantener todo el esfuerzo e inversión ya realizada en la infraestructura.

Hemos escuchado directamente de cientos de desarrolladores, como JRebel no solo ha cambiado para siempre la productividad – ahorrando más de 5 semanas de trabajo completas perdidas por reinicios Java cada año – sino que también en la forma de escribir código, como descubrir fallos y probar interactivamente para minimizar peticiones de servicio y errores.

La alegría que ofrecemos se logra de una manera sensible, no a través de magia oscura de algo “on rails”. Nada en tu aplicación (incluyendo frameworks) es vago, ambiguo o ofuscado. Todo lo que hacemos es algo de magia con las JVMs y frameworks populares open source. Y sólo entre las paredes de Hogwarts (durante desarrollo). El software entregable no tiene ninguna penalización en tiempo de ejecución o dependencias persistentes.

Para más información, puedes consultar la página de ayuda: Instalando y usando JRebel en Eclipse IDE & Tomcat