我正在使用Aspectj通过第三方注释来定位方法。但是,我不能保证此注释将在类路径上可用。有没有一种方法可以从可选依赖项中定位注释?
作为一个例子,我可能想针对JUnit 5的@ParameterizedTest
注释。我的.aj文件如下所示:
public aspect Example {
pointcut beforeTest(): @annotation(ParamterizedTest);
before(): beforeTest() {
System.out.println("This is a Parameterized Test!");
}
}
但是,如果我的项目使用的是JUnit 4,或者不包含junit-jupiter-params库,那么Maven将无法进行编织,因为它找不到该类:
2019-02-04 16:37:37.649 [ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.11:test-compile (default) on project ExampleProject: AJC compiler errors:
2019-02-04 16:37:37.650 [ERROR] error at (no source information available)
2019-02-04 16:37:37.656 [ERROR] /jenkins/workspace/exampleProject/src/test/java/com/example/ExampleTest.java:0::0 can't determine annotations of missing type org.junit.jupiter.params.ParameterizedTest
2019-02-04 16:37:37.657 [ERROR] when weaving type com.example.ExampleTest
2019-02-04 16:37:37.657 [ERROR] when weaving classes
2019-02-04 16:37:37.657 [ERROR] when weaving
2019-02-04 16:37:37.658 [ERROR] when batch building BuildConfig[null] #Files=21 AopXmls=#0
2019-02-04 16:37:37.658 [ERROR] [Xlint:cantFindType]
我尝试像这样将库添加到aspectj-maven-plugin
的{{1}}部分:
<dependencies>
...但是没有区别。
是否有一种无需添加依赖项即可完成这项工作的方法?我非常希望切入点能够工作,如果有使用第三方注释(如果存在)进行注释的方法,那么该方法将被忽略。
(出于junit示例的目的,我构建该示例以确认其与我的实际问题相同,我的方面库确实声明了对junit-jupiter-params的依赖。)
答案 0 :(得分:0)
您的方面使用该类,即使您的示例代码未显示该类,也必须在您的方面之上对其进行导入。这意味着它绝对是方面库的依赖项,而不是可选的。因此,您必须在库的Maven POM中对此进行定义。其他一切都没有意义。无论如何定义它有什么大不了的?适当的依赖管理是Maven的目标。
更新:感谢您的澄清评论。
您可以使用基于注释的语法而不是本机语法,因为它不需要导入。切入点将不匹配,因为随后将显示另一个Xlint警告。
如果您可以选择使用AspectJ编译器编译其他项目,我还建议您研究@DeclareError
和@DeclareWarning
。这将帮助您强制执行策略,在编译过程中不要使用参数化测试,而不会在运行时抛出错误或记录某些内容。 AspectJ编译器不会使用该批注编译测试。