AspectJ:如何获得切入点来建议位于其他项目中的类

时间:2010-09-09 18:44:29

标签: java eclipse aspectj ajdt pointcuts

这应该很简单。

问题
如何在一个项目中获得切入点来建议另一个项目中的代码/类?

<小时/> 的上下文
我正在两个项目的日食工作。为了便于解释,让我们调用一个 科学项目 和另一个 数学项目 ,并说科学项目依赖于数学项目和我同时在两个项目中开发。数学项目是生产中的核心产品,如果我不修改代码,生活会更容易。

目前,我正在调试这两个项目之间的交互。为了帮助解决这个问题,我正在编写一个Aspect(在科学项目中),以便在数学代码(和科学代码)执行时记录关键信息。

<小时/> 示例
我按照以下方式运行一个简单的示例方面:

package org.science.example;

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

<小时/> 的问题
问题是,无论我创建什么切入点,它只建议来自科学项目的代码。 org.math.example中的任何类都不是横切的,全部都是!

我尝试将数学项目添加到 inpath 中科学项目转到proect properties > AspectJ Build > 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

所以也许这是正确的设置,错误更微妙。顺便提一下,提到的课程来自“科学项目”,可以这么说。即使在我清理项目后也会发生这种情况。我目前正在搜索此错误...


编辑2:
我找到了上面错误的解决方案 comment #5 here

问题是maven-aspectj-plugin的pom文件声明了对aspectjtools版本1.6.7的依赖。因此,在配置插件时,必须修改该瞬态依赖性。这是pom文件的相关代码片段,通过指定版本1.6.9而不是1.6.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>

2 个答案:

答案 0 :(得分:5)

你的第二个问题与第一个问题无关。据说com.our.project.adapter.GenericMessagingAdapter最初是针对新版本的AspectJ进行编译和编织的,但是用于对旧版AspectJ进行二进制编织。

这与您尝试在1.5 VM上运行1.6下编译的Java类时的问题基本相同。

版本号因为AspectJ 1.6.8的发布而加速(我认为,或者可能是1.6.7)。

解决方案是确保您为所有项目使用最新版本的AspectJ(例如1.6.9或1.6.10的开发版)。

答案 1 :(得分:2)

当您将Math项目添加到科学项目的路径中时,所有数学项目的代码都通过aspectj weaver发送并正确编织。编织的结果写入科学项目的输出文件夹(不是数学项目的)。所以,如果你要查看科学项目的bin文件夹,你应该在那里看到编织类。

如果要将路径内文件与常规文件分开,可以指定inpath out文件夹。此文件夹也应作为二进制文件夹添加到类路径中。此外,此文件夹应位于项目依赖项之上,并且位于Science项目的Java构建页面的“导出和排序”选项卡中的Math项目。

最后,如果您从Science项目运行主类,而不是从Math项目运行,您将执行编织代码。