6

这应该很简单。

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


上下文
我正在 Eclipse 中使用两个项目。为了便于解释,我们称一个科学项目和另一个数学项目,并说科学项目依赖于数学项目,我正在同时开发这两个项目。数学项目是核心产品,在生产中,如果我不修改代码,生活会更轻松。

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


示例
我按照以下方式运行一个简单的示例方面:

package org.science.example;

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


问题
问题是,无论我创建什么切入点,它都只建议来自科学项目的代码。没有任何课程org.math.example是横切的,根本没有!

我尝试通过转到并单击添加项目并选择数学项目将数学项目添加到科学项目的路径中。那没有用,但似乎我需要按照这些思路做一些事情。proect properties > AspectJ Build > Inpath

在此先感谢您的任何建议...

-g男性


编辑 1:
自从写这篇文章以来,我注意到该项目出现以下错误:

引起:org.aspectj.weaver.BCException:无法继续,这个版本的AspectJ
支持使用 weaver 6.0 版构建的类,但该类
com.our.project.adapter.GenericMessagingAdapter 是 7.0 版
当批量构建 BuildConfig[null] #Files=52 AopXmls=#0

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


编辑 2:我在此处的评论 #5
中找到了上述错误的解决方案

问题是 maven-aspectj-plugin 的 pom 文件声明了对 aspectjtools 版本 1.6.7 的依赖。因此,在配置插件时,必须修改临时依赖项。这是通过指定版本 1.6.9 而不是 1.6.7 来解决问题的 pom 文件的相关代码片段:

                    <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

2 回答 2

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 的开发版本)。

于 2010-09-10T21:06:55.223 回答
2

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

如果您想将输入路径文件与常规文件分开,您可以指定一个输入路径输出文件夹。该文件夹也应该作为二进制文件夹添加到类路径中。此外,该文件夹应放置在科学项目的 Java 构建页面的“导出和排序”选项卡中数学项目的项目依赖项之上。

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

于 2010-09-09T19:39:48.487 回答