2011-07-12 61 views
7

我們使用aspectJ在現有的應用程序上獲得一些度量。在Eclipse中使用AJDT進行構建和編織時,一切都很好。但是在整合env。我們使用ant腳本來構建和部署應用程序。NoSuchMethodError在運行時使用iajc編譯的aspectOf()

的問題上發生了的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; 
     } 

    } 

} 

Basicaly,我想攔截我的方面包內的每一個電話,除了在的ExceptionHandler本身。

Ant構建這個樣子的:

<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沒有編織!

我希望有人能幫助我在這一個;-)

+0

這個錯誤有一個更常見的原因[here](http://stackoverflow.com/questions/12929716/why-server-complaining-about-aspectof-is-missing) –

回答

5

終於找到了問題。我們的應用程序也依賴於包含方面的通用模塊jar。

基本包名稱相同:com.xxx.aop和我們用於我們方面的基類是相同的名稱。所以加載了2 com.xxx.aop.AspectBase.class

由於我們在我們的Ant構建文件中使用了一個標誌來啓用編譯時織入的是/否,我們的一個AspectBase.class不是編織而另一個是編織的。

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> 

我希望這有助於!

+0

感謝您的回覆。其實,我可以看到我的方面是編織的。因爲當我反編譯它們時,我發現在ExceptionHandler的反編譯代碼中可以看到aspectOf()和hasAspect()。所有這些方面都包含在項目中。它們都包含在inpath中。我們打算放置在aspectpath中什麼? aspecjrt.jar? – Cygnusx1

+0

你想編入你的代碼的方面。在上面的例子中包含一個交易方面,它將交易邏輯交織到所有用@Transactional標記的方法。如果你在inpath中有你的方面,它也應該起作用。 – Espen

+0

再次感謝您花時間回覆。其實你迴應了我發佈的關於aspectpath的另一個問題;-)但不幸的是它仍然不起作用。我的方面包含在與應用程序的基本代碼相同的項目中。所以他們實際上在入口處。但ExceptionHandler在運行時有一個NoSuchMethodError仍然沒有運氣。如果我評論ExceptionHandler的切入點,一切都很好。所以ExceptionHandler是因爲......但是爲什麼我仍然不知道:-( – Cygnusx1

0

我有非常類似的問題

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

我使用Spring 3.1.2 +的Maven 3.0.4 + Tomcat的7.0.29和OD倍碰巧的是,當我啓動Tomcat我得到這個例外。

我不知道爲什麼會發生這種情況。我使用的是Spring Tool Suit IDE,但是當我從命令行執行mvn clean install(不在IDE中)時,它以某種方式得到修復,也許這有助於某人。