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

时间:2011-07-12 14:33:36

标签: 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; 
        }

    }

}

基本上,我想截取我的方面包中的每个调用,除了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>

$ {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)

看起来ExceptionHandler没有编织!!!

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

我有类似的问题

java.lang.NoSuchMethodError: ....aspectOf()...

我正在使用Spring 3.1.2 + Maven 3.0.4 + Tomcat 7.0.29,而且当我启动Tomcat时会发生这种情况。

我不知道为什么会这样。我正在使用Spring Tool Suit IDE,但是当我从命令行执行mvn clean install时(不在IDE中)它会以某种方式得到修复,这可能对某人有帮助。

答案 2 :(得分:0)

看起来您忘记声明方面路径。你所有的任务都是编译而不是编织。这导致了java.lang.NoSuchMethodError

下面的示例演示如何使用iajc任务进行编织:

<iajc outjar="demo.jar">
    <sourceroots>
        <pathelement location=”src” />
        <pathelement location=".." />
    </sourceroots>
    <aspectpath>
        <pathelement location="org.springframework.aspects-3.0.0.RC1.jar" />
    </aspectpath>
</iajc>

我希望这有帮助!

答案 3 :(得分:0)

当我使用Spring Boot时遇到了这个异常,但是我对AspectJ的配置是以“旧方式”完成的。

如果您使用的是Spring Boot,请确保在pom.xml / build.gradle中只有一个依赖项 org.springframework.boot:spring-boot-starter-aop 。 然后,您不需要任何其他@Configuration方面的内容,只需执行以下操作即可:

@Aspect
@Component
public class LogEntityChangesAspect {

    @Autowired
    private ChangeLogDao changeLogDao;