JRebel

Que es JRebel??

Antes de dar una descripción técnica quiero compartir este video animado que explica perfectamente bien que es y como funciona JRebel =):

jaja cierto o no, uno termina frustrado por cosas así y que en la vida real si pasan, por ejemplo en mi trabajo tenemos una aplicación con unos 70 wars y el despliegue puede tomar si bien te va varios minutos dependiendo de tu equipo ( si te hablo a tí Sakai!! ¬¬ ) , pero bueno ahora vamos a verlo en acción =) :

En el sitio oficial (http://zeroturnaround.com/software/jrebel/) lo describen así:

JRebel is a JVM-plugin that makes it possible for Java developers to instantly see any code change made to an app without redeploying. JRebel lets you see code changes instantly, versioning classes and resources individually and updating one at a time instead of as a lump application redeploy.

Instalación

Ya  que vimos las bondades de está magnifica herramienta vamos a lo que a muchos nos interesa, la instalación. Desgraciadamente es un producto comercial que requiere de licenciamiento, así que si deseas utilizarlo en tu trabajo van a tener que pagar por una licencia.

Pero también ofrecen una licencia comunitaria cuyo uso está limitado a practicas no comerciales y su costo es un solo tweet al mes sobre JRebel (precio justo para mi bolsillo😄 jaja), así que solo hay que ingresar a la página https://social.jrebel.com/ y solciitar la licencia.

Después de que tienes la licencia la página te lleva paso a paso con la instalación dependiendo de tu IDE y tu servidor de aplicaciones, aunque aquí http://manuals.zeroturnaround.com/jrebel-reference-manual/ pueden leer a detalle los pasos.

Actualmente lo instale sobre mi equipo con Intellij y el mismo instalador te ofrece las instrucciones especificas por servidor, aquí dejo el ejemplo de lo que me salio:

Add into project

Add the following snippet to your parent pom.xml. The rebel.xml configuration file will be generated for each individual sub-module of your maven project.

<plugin>
  <groupId>org.zeroturnaround</groupId>
  <artifactId>jrebel-maven-plugin</artifactId>
  <version>1.1.1</version>
  <executions>
    <execution>
      <id>generate-rebel-xml</id>
      <phase>process-resources</phase>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

This will generate JRebel configuration file rebel.xml automatically on every build. If you want to generate the rebel.xml manually run mvn jrebel:generate -Drebel.xml.dir=OUTPUT_DIRECTORY (by default OUTPUT_DIRECTORY is target/classes). Adding -Drebel.generate.show=true will print out generated rebel.xml at info level, so you can immediately see what was generated.

By default, the generated rebel.xml contains absolute paths to your workspace. However if you want to deploy the artifacts for your team to use, you will need to make sure that the paths are relative using a configurable custom property.

Assuming that you have the following project structure in directory c:\projects\:

my-maven-project1
  my-jar1
  my-war1

You should add the following configuration to the plugin:

<configuration>
  <!--
 root is 2 directories up from the jar/war modules
 -->
  <relativePath>../../</relativePath>
  <!--
 use a custom property for specifying root directory (note the double $)
 set the property in JRebel configuration or as -Dmyproject.root=c:/projects/
 -->
  <rootPath>$${myproject.root}</rootPath>
</configuration>

Now by example you will have c:/projects/my-maven-project1/my-jar1/target/classes as ${myproject.root}/my-maven-project1/my-jar1/target/classes in the rebel.xml. You can set this property as a Java System property (-Dmyproject.root=c:/projects/) or in the JRebel Agent Configuration:

Add into server:

Apache Tomcat 5.x 6.x 7.x

Go to $TOMCAT_HOME/bin and create the file startup-jrebel.sh with the following contents:


#!/bin/bash
export JAVA_OPTS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar $JAVA_OPTS"
`dirname $0`/startup.sh $@

You can also create a catalina-jrebel.sh with the following content:


#!/bin/bash
export JAVA_OPTS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar $JAVA_OPTS"
`dirname $0`/catalina.sh $@

Make them executable and use those scripts instead of startup.sh and catalina.sh if you want to run Tomcat with JRebel.

Glassfish

In the Administration Console open Configuration » JVM Settings » JVM Options

Use the Add JVM Option button to insert the following option:

-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar

Press Save and restart the server.

Jetty

The newer Jetty distributions (starting from 6.x) come with the bin/jetty.sh script in the Jetty’s installation directory.

Go to $JETTY_HOME/bin and create the file run-jrebel.sh with the following contents:


#!/bin/bash
export JAVA_OPTS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar -Xms256m -Xmx512m -XX:MaxPermSize=256m $JAVA_OPTS"
`dirname $0`/jetty.sh $@

Use this script instead of jetty.sh if you want to run Jetty with JRebel.

Maven Jetty Plugin

Edit your pom.xml file and set the scanIntervalSeconds param to 0, this will turn off Jetty’s internal reloading. It should look like this:


<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <configuration>
    <scanIntervalSeconds>0</scanIntervalSeconds>
  </configuration>
</plugin>

Add the following line to the MAVEN_OPTS environment variable:

-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar

To do it in the console:

  > export MAVEN_OPTS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar $MAVEN_OPTS"
  > mvn jetty:run

IBM Websphere AS CE

Go to $WEBSPHERE_CE_HOME/bin and create the file startup-jrebel.sh with the following contents:


#!/bin/bash
export JAVA_OPTS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar"
`dirname $0`/startup.sh $@

Use this script instead of startup.sh if you want to run WebSphere CE with JRebel.

Oracle Weblogic 9.x 10.x

Go to $DOMAIN_HOME/bin and create the file startWeblogic-jrebel.sh with the following contents:


#!/bin/bash
export JAVA_OPTIONS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar $JAVA_OPTIONS"
`dirname $0`/startWebLogic.sh $@

Use this script instead of startWeblogic.sh if you want to run Weblogic with JRebel.

It is highly recommended to avoid using class caching (CLASS_CACHE=true) because in some cases it may prevent classes and resources from being reloaded.

Oracle App Server 10.x

Go to $ORACLE10_HOME/bin and create the file oc4j-jrebel.sh with the following contents:


#!/bin/bash
export OC4J_JVM_ARGS="-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar $OC4J_JVM_ARGS"
`dirname $0`/oc4j $@

Use this script instead of oc4j if you want to run OC4J with JRebel.

Oracle App Server 9.x

Go to folder $ORACLE9_HOME/j2ee/home and start the server with the following command:

java -javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar -jar oc4j.jar

Spring Source Tc Server

Go to $SPRING_TC_HOME, choose the Tomcat instance ($CATALINA_BASE) you would like to run.

Open the $CATALINA_BASE/conf/wrapper.conf configuration file for editing.

In the Java Additional Parameters section, add the additional wrapper.java.additional.* properties:

wrapper.java.additional.10=-javaagent:/Volumes/Datos/jaehoo/Library/Application\ Support/IntelliJIdea11/jr-ide-idea/lib/jrebel/jrebel.jar

Use the $SPRING_TC_HOME/tcruntime-ctl.bat script to start Tomcat instances as usual.

Y para completar un video de la instalación con el Intellij:

Getting started with JRebel and IntelliJ IDEA from Anton Arhipov on Vimeo.

JRebel and OSGI

Hace tiempo comencé a leer sobre OSGI y realmente me agrado mucho la filosofía de la programación modular, sin embargo tenia que realizar demasiadas cosas para poder comenzar a crear bundles reutilizables en proyectos web (wars y ears) y aunque el subtítlulo de este articulo no tiene nada que ver porque las dos son cosas muy diferentes.

Pero para mi es así:

JRebel es un mecanismo para optimizar los tiempos de despliege.

OSGI es una estructura de programación modular para la reutilización, versionado y el despliegue de artefactos.

En fin me gusto mucho esté artículo y lo quiero colocar como referencia: http://talkweb.eu/openweb/1026

Bueno en los próximos días realizare pruebas más intensibas ya sobre los frameworks ;)…

Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s