NoSuchMethodError aspectOf () во время выполнения из сборки с помощью iajc - PullRequest
8 голосов
/ 12 июля 2011

Мы использовали aspectJ, чтобы получить метрику для существующего приложения. При создании и ткачестве с AJDT в затмении все отлично работает. Но в интеграции env. мы используем 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.

сборка муравья выглядит так:

<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 создала приложение и аспекты

Из результата

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 не был соткан !!!

Я надеюсь, что кто-то может помочь мне в этом; -)

Ответы [ 3 ]

5 голосов
/ 23 августа 2011

Наконец-то нашел проблему. Наше приложение зависело от общего модуля jar, который также содержал аспект.

Базовое имя пакета было таким же: com.xxx.aop и базовый класс, который мы использовали для наших аспектов, был тем же именем. Итак, 2 com.xxx.aop.AspectBase.class были загружены.

Так как мы использовали флаг в нашем файле сборки Ant, чтобы разрешить переплетение времени компиляции со значением yes / no, один из наших AspectBase.class не был соткан, а другой был.

1 голос
/ 09 октября 2012

У меня была очень похожая проблема

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), это как-то исправляется, возможно, это кому-нибудь поможет.

0 голосов
/ 13 июля 2011

похоже, что вы забыли объявить путь аспекта. Все, что вам нужно сделать, это скомпилировать, но не переплетать. И это приводит к 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>

Надеюсь, это поможет!

...