We used aspectJ to get some metric on an existing application. When building and weaving with AJDT in eclipse, everything works great. But in the integration env. we use an ant script to build and deploy the application.
The problem occur on an ExceptionHandler i did to be sure our aspect would not throw exception and break the application
@Aspect
public class ExceptionHandlerAspect {
/**
* Pointcut
*/
@Pointcut("within(com.xxx.yyy.aop.aspect.*..*)")
public void allMethodInAspectPackage() {}
/**
* Pointcut
*/
@Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)")
public void notInExceptionHandlerAspectClass() {}
/**
* Pointcut
*/
@Pointcut("call(* *(..))")
public void allClassAndMethod() {}
/**
@Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()")
public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{
Object ret = null;
try {
ret = joinPoint.proceed();
}catch (Throwable exception) {
if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) {
throw exception;
}
this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception);
}finally {
return ret;
}
}
}
Basicaly, i want to intercept every call within my aspects package except in the ExceptionHandler itself.
the ant build look like this :
<iajc inpath="${classes.dir}" destDir="${classes.dir}" fork="true" maxmem="${aspectj.maxmem}" verbose="true" showWeaveInfo="true" debug="true">
<classpath refid="ajclasspath"/>
</iajc>
The ${classes.dir} is the classes directory where the javac task built the application and the aspects
From the result,
Exception in thread "main" java.lang.NoSuchMethodError: com.xxx.yyy.aop.aspect.ExceptionHandlerAspect.aspectOf()Lcom/xxx/yyy/aop/aspect/ExceptionHandlerAspect;
at com.xxx.yyy.aop.aspect.ecs.AspectBaseEcs.inspectLoginInfo(AspectBaseEcs.java:65)
at com.xxx.yyy.app.es.security.Security.loadApplications(Security.java:172)
at com.xxx.yyy.app.es.gui.VSDlgLogin.loadSecurity(VSDlgLogin.java:346)
at com.xx.yyy.app.es.ApplicationSuite.start(ApplicationSuite.java:839)
at com.xxx.yyy.app.es.ApplicationSuite.main(ApplicationSuite.java:501)
it looks like the ExceptionHandler was not weaved!!!
I hope someone can help me on this one ;-)
Finally found the problem. Our Application had a dependency on common module jar that was containing aspect too.
The base package name was the same: com.xxx.aop
and the base class we used for our aspects was the same name. So 2 com.xxx.aop.AspectBase.class
were loaded.
Since we used a flag in our Ant build file to enable compile time weaving at yes/no, one of our AspectBase.class
was not weaved while the other was.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With