AspectJ aplicado sobre una librería jar
El problema inicial es el siguiente: tenemos una aplicación java bajo prueba, formada por un conjunto de ficheros “jar”, de cuyo código conocemos algunos (o todos los) interfaces públicos.
A efectos prácticos, supongamos un único fichero jar llamado “underTest.jar” (los resultados son extensibles) y la clase que contiene el método “main” es “MainClass”, dentro del paquete “mainpack”:
public class MainClass {
public MainClass() {
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Ejecutando el main...");
}
}
Así, el comando para ejecutar la aplicación sería:
java -classpath underTest.jar mainpack.MainClass
El resultado de la ejecución sería:
Ejecutando el main...
En este caso, podemos utilizar AspectJ para insertar puntos de ruptura, logear información de ejecución, de performance, etc.
Vamos con la prueba de concepto.
En primer lugar, vamos a crear una librería (jar) con los “aspectos” a utilizar. En este caso, algo muy simple: una clase que traza la entrada y la salida del método “main” de nuestra aplicación.
El código sería:
public aspect ProfilingAspect {
pointcut mainMethod() : execution(static * *.main(..));
before() : mainMethod()
{
System.out.println("Entrando al main...");
}
after() : mainMethod()
{
System.out.println("Saliendo del main...");
}
}
Podemos usar eclipse para crear un proyecto de tipo AspectJ, compilarlo y generar un fichero jar con soporte para AspectJ (echar un vistazo a las Cheat Sheets de eclipse con el plugin AJDT).
Supongamos que el fichero jar creado con el “aspecto” anterior es mainAspect.jar.
El siguiente paso sería modificar el comando utilizado para ejecutar la aplicación:
java -classpath $ASPECTJ_HOME/aspectjweaver.jar:$ASPECTJ_HOME/aspectjrt.jar:. -Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader -Daj.class.path=mainAspect.jar:underTest.jar -Daj.aspect.path=mainAspect.jar mainpack.MainClass
Donde $ASPECTJ_HOME apunta al directorio de instalación de las librerías de AspectJ (aspectjweaver.jar y aspectjrt.jar) en la máquina. Con esto el resultado de la ejecución sería:
Entrando al main... Ejecutando el main... Saliendo del main...
Relacionados:





