Eclipse: WTP y Maven en el mismo proyecto
Al manejar un proyecto con Maven es muy comun encontrarse con que nuestro proyecto no se integra demasiado bien con todas caracteristicas que ofrecen los IDEs. Si estamos desarrollando aplicaciones web vamos a tener problemas tratando de que Netbeans o Eclipse se aviven de que necesitamos usar los servers del IDE para debugear y al final terminamos haciendo todo a traves de los goals de maven, lo cual no siempre es muy cómodo.
En Eclipse hay una forma de poder usar el ‘run on server’ (alt+shift+X,R) directamente desde nuestro proyecto Maven y consiste en incorporar el Plugin que da soporte a Eclipse Web Tools Platform al pom.xml del proyecto.
Receta:
1- Crear el proyecto de maven como normalmente lo hariamos. Por ejemplo con un archetype de myfaces
$ mvn archetype:create -DgroupId=ar.com.mgaravaglia -DartifactId=testWebApp -DarchetypeGroupId=org.apache.myfaces.build -DarchetypeArtifactId=myfaces-archetype-helloworld
2- Modificar el archivo pom.xml creado agregando la referencia al plugin maven-eclipse-plugin en el elemento build
maven-eclipse-plugin
2.0
true
true
true
true
[artifactId]-[version]
${basedir}/src/main/resources/META-INF/MANIFEST.MF
3- Generar el proyecto de eclipse desde maven.
$ mvn eclipse:clean; mvn eclipse:eclipse
4- Una vez dentro de eclipse importar el proyecto como un maven project.
5- Ejecutar y Debuggear a gusto en el tomcat instalado en eclipse usando el ‘Run on Server’
Alineando los planetas para JMX
Cada vez que tengo que testear un Apache Tomcat nuevo usando jconsole o jvisualvm me pasa lo mismo. A continuación: Lista bullet-proof Para hacer andar el JMX del Tomcat.
1- Agregar los siguientes parametros a la JVM del Tomcat
-Dcom.sun.management.jmxremote.port=7000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
2- No tiene que haber inconsistencias en los hostname de la maquina. Es bastante comun que tirar el comando ‘hostname’ devuelvo algo totalmente distinto a lo que dice el /etc/hosts y el RMI es algo susceptible a esto. Ejemplo que funciona correctamente:
#hostname
maquina.dominio.com
#cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
10.1.3.24 maquina.dominio.com
Ahora al conectarnos via jconsole, jvisualvm o cualquier otro cliente JMX a 10.1.3.24:7000 no deberiamos tener problemas
Puzzle!
Volvió el puzzle! Esta vez es fácil, ya que es una practica común, pero me encontré con mucha gente que no sabia de esto. Por favor, que alguien me explique por qué funciona el siguiente código.
List frutas = new ArrayList(){{ add("Manzana");add("Naranja");add("Pera");}};
SourceMonitor
SourceMonitor es una aplicación freeware que examina el codigo fuente de nuestros proyectos y calcula distintas metricas acerca la complejidad que encuentra. Una caracteristica muy interesante es la posibilidad de tomar ’snapshots’ de los valores arrojados por las metricas para poder compararlos a lo largo de tiempo . Soporta Java, C, C++ y unos cuantos lenguajes más
Muy util para saber en que momento hay que empezar a refactorear.
Scripting en Java
En Java es posible interpretar virtualmente cualquier lenguaje de scripting utilizando una API bastante simple introducida a partir de la versión 1.6 por obra de la JSR223. Estos lenguajes se incorporan en nuestros proyectos como simples Jars que luego son descubiertos por un ScriptEngineManager que los regentea.
JSE6 incorpora out-of-the-box el engine Rhino asi que tenemos la posibilidad de ejecutar código JavaScript en nuestras aplicaciónes haciendo poco y nada.
ScriptEngineManager scm = new ScriptEngineManager();
ScriptEngine jsEngine = scm.getEngineByName("JavaScript");
Uhm… listo! estamos listos para interpretar javascript. Por un proceso de discovering (siguiendo la linea de los *Manager de Java) el ScriptEngineManager sabe que hacer cuando le pedimos un Engine de “JavaScript” y nos devuelve una instancia de ScriptEngine.
String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "print(sum);";
jsEngine.eval(script); // 25
el metodo eval del ScriptEngine interpreta el String que le pasamos como parametro y en la consola terminariamos con un “25″. However, el scripting en Java es mucho más inteligente, el metodo eval devuelve un Object que contiene el valor del ultimo statement del script. El mapeo del valor que ‘retorna’ el script contra los tipos de datos de Java es especifico del Engine por lo que nos vamos a encontrar con comportamientos diferentes segun el lenguaje (y el engine) que interpretemos.
String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "sum;";
Double d = (Double) jsEngine.eval(script);
System.out.println( d +1 ); //26!!!
Con esta feature de JSE6 es inevitable pensar en dar un paso más en la parametrización de nuestros sistemas ya no solo parametrizando valores y constantes sino también la logica de determinados procesos a traves de scripts simples en JS, Phyton, Ruby, Groovy, Jaskell o lo que sea. Otra ventaja en el uso de de esta API esta en incorporar lenguajes que nos eliminan el ciclo de code-compile-deploy-test pero sin alejarnos de la plataforma Java.