这应该很简单。
问题
如何在一个项目中获得切入点来建议另一个项目中的代码/类?
目前,我正在调试这两个项目之间的交互。为了帮助解决这个问题,我正在编写一个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
并点击添加项目并选择数学项目。这没用,但似乎我需要按照这些方式做点什么。
提前感谢任何建议......
-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
所以也许这是正确的设置,错误更微妙。顺便提一下,提到的课程来自“科学项目”,可以这么说。即使在我清理项目后也会发生这种情况。我目前正在搜索此错误...
问题是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>
答案 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项目运行,您将执行编织代码。