来自可选依赖项的Aspectj切入点定位注释

时间:2019-02-05 00:02:19

标签: java aspectj aspectj-maven-plugin

我正在使用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的依赖。)

1 个答案:

答案 0 :(得分:0)

您的方面使用该类,即使您的示例代码未显示该类,也必须在您的方面之上对其进行导入。这意味着它绝对是方面库的依赖项,而不是可选的。因此,您必须在库的Maven POM中对此进行定义。其他一切都没有意义。无论如何定义它有什么大不了的?适当的依赖管理是Maven的目标。


更新:感谢您的澄清评论。

您可以使用基于注释的语法而不是本机语法,因为它不需要导入。切入点将不匹配,因为随后将显示另一个Xlint警告。

如果您可以选择使用AspectJ编译器编译其他项目,我还建议您研究@DeclareError@DeclareWarning。这将帮助您强制执行策略,在编译过程中不要使用参数化测试,而不会在运行时抛出错误或记录某些内容。 AspectJ编译器不会使用该批注编译测试。