2010-09-09 45 views
6

這應該很簡單。AspectJ:如何讓切入點通知位於其他項目中的類

問題
你如何在一個項目一個切入點到另一個項目中建議的代碼/類?


上下文
我在eclipse中與兩個項目工作。爲了便於說明,我們姑且稱之爲一個 科學項目和其他 數學項目說科學項目依託數學項目,我在這兩個項目開發,兼營。數學項目是生產中的核心產品,如果我不修改代碼,生活將變得更加簡單。

目前,我正在調試這兩個項目之間的交互。爲了提供幫助,我正在編寫一個方面(在科學項目中),以便在數學代碼(和科學代碼)執行時記錄關鍵信息。



我運行沿着線的簡單示例方面:

package org.science.example; 

public aspect ScientificLog { 
    public pointcut testCut() : execution (public * *.*(..)); 
    before() : testCut() { 
     //do stuff 
    } 
} 


問題
的問題是,無論創建什麼切入點,它僅建議來自 科學計劃的代碼。從 org.math.example沒有類是橫切,在所有!

我試圖去 proect properties > AspectJ Build > Inpath和點擊 添加項目並選擇 數學項目加入 數學項目INPATH的科學項目。這不起作用,但似乎我需要沿着這些路線做些事情。

感謝,提前,對於任何建議...

-gMale


編輯1:
既然寫這個,我已經注意到這個項目是給了以下錯誤:

Caused by: org.aspectj.weaver.BCException: Unable to continue, this version of AspectJ 
supports classes built with weaver version 6.0 but the class 
com.our.project.adapter.GenericMessagingAdapter is version 7.0 
when batch building BuildConfig[null] #Files=52 AopXmls=#0

所以也許這是安裝正確,錯誤更微妙。順便說一句,所提到的課程來自「科學項目」,可以這麼說。甚至在我清理項目之後,這種情況也會發生我目前正在使用Google這個錯誤...


編輯2:
我發現上面 comment #5 here

解決錯誤的問題是Maven的AspectJ的插件的POM文件聲明上aspectjtools版本1.6的依賴0.7。所以,在配置插件時,必須修改該瞬態依賴關係。以下是通過指定版本1.6.9而不是1.6修復問題的pom文件的相關代碼片段。7:

    <plugin> 
          <groupId>org.codehaus.mojo</groupId> 
          <artifactId>aspectj-maven-plugin</artifactId> 
          <version>1.3</version> 
          <dependencies> 
           <dependency> 
            <groupId>org.aspectj</groupId> 
            <artifactId>aspectjtools</artifactId> 
            <version>1.6.9</version> 
           </dependency> 
          </dependencies> 
          <configuration> 
            <source>1.6</source> 
            <target>1.6</target> 
          </configuration> 
          <executions> 
            <execution> 
              <goals> 
                <goal>compile</goal> 
                <goal>test-compile</goal> 
              </goals> 
            </execution> 
          </executions> 
        </plugin> 

回答

4

你的第二個問題與第一個問題無關。它是說com.our.project.adapter.GenericMessagingAdapter最初是針對新版本的AspectJ進行編譯和編譯的,但是它被用於針對舊版本的AspectJ進行二進制編織。

這基本上是同樣的問題,當您嘗試運行在1.5 VM 1.6下編譯的Java類。

版本號被髮動起來,爲的AspectJ 1.6.8的版本(我想,也許這是1.6.7)。

的解決方案是,以確保您使用的是最新版本的AspectJ的所有項目(EG-1.6.9,或開發人員構建的1.6.10)。

+0

謝謝,你完全正確。我剛剛解決了這個例外,並相應地更新了我的問題。不幸的是,出於時間原因,我基本上被指示將「數學項目」直接引入「科學項目」。顯然,這樣可以避免這個問題,但我無法確定修復第二個bug的影響,因爲現在代碼庫完全不同,而且在顛覆中回溯會花費太多時間。謝謝你的幫助。既然你是唯一的迴應,我就會投票給你所有的信息並獎勵你的答案。謝謝! – gMale 2010-09-11 02:26:11

2

當您在科學項目的路徑添加數學項目的,所有的數學項目的代碼是通過AspectJ織入發送和正常編織。該織物的結果被寫入科學項目的輸出文件夾(不是Math項目的文件夾)。所以,如果您要查看科學項目的bin文件夾,您應該在那裏看到編織類。

如果你想保持在路徑文件從普通文件分開,你可以指定一個INPATH出來的文件夾。該文件夾也應該作爲二進制文件夾添加到類路徑中。此外,該文件夾應放置在科學項目的Java構建頁面的「導出和排序」選項卡中的Math項目依賴項之上。

最後,如果您從科學項目的主類,而不是從數學的項目,你將被執行的代碼編織。

+0

感謝您的回覆。基本上,你已經證實我應該能夠得到這個工作,並且入路是正確的路。自寫這個問題以來,我現在注意到我目前在使用谷歌搜索的一個錯誤。也許這是唯一的問題...我會用錯誤更新問題。 – gMale 2010-09-09 20:01:36