我们使用aspectJ来获取现有应用程序的一些指标.在eclipse中使用AJDT进行构建和编织时,一切都很有效.但在整合环境中.我们使用ant脚本来构建和部署应用程序.
问题发生在ExceptionHandler上我确实我们的方面不会抛出异常并破坏应用程序
@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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想拦截我的方面包中的每个调用,除了在ExceptionHandler本身.
ant build看起来像这样:
<iajc inpath="${classes.dir}" destDir="${classes.dir}" fork="true" maxmem="${aspectj.maxmem}" verbose="true" showWeaveInfo="true" debug="true">
<classpath refid="ajclasspath"/>
</iajc>
Run Code Online (Sandbox Code Playgroud)
$ {classes.dir}是javac任务构建应用程序和方面的classes目录
从结果来看,
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)
Run Code Online (Sandbox Code Playgroud)
它看起来像ExceptionHandler没有编织!
我希望有人可以帮助我这个;-)
终于找到了问题.我们的应用程序依赖于包含方面的公共模块jar.
基本包名称是相同的:com.xxx.aop
我们用于方面的基类是相同的名称.所以2 com.xxx.aop.AspectBase.class
装了.
因为我们在Ant构建文件中使用了一个标志来启用编译时编织在是/否,所以我们AspectBase.class
中的一个没有编织而另一个编织时没有编织.
归档时间: |
|
查看次数: |
9117 次 |
最近记录: |