NoSuchMethodError aspectOf()在运行时从使用iajc构建

Cyg*_*sx1 8 aspectj

我们使用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没有编织!

我希望有人可以帮助我这个;-)

Cyg*_*sx1 5

终于找到了问题.我们的应用程序依赖于包含方面的公共模块jar.

基本包名称是相同的:com.xxx.aop我们用于方面的基类是相同的名称.所以2 com.xxx.aop.AspectBase.class 装了.

因为我们在Ant构建文件中使用了一个标志来启用编译时编织在是/否,所以我们AspectBase.class中的一个没有编织而另一个编织时没有编织.