java - 来自可选依赖项的 Aspectj 切入点目标注释

标签 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<dependencies>像这样的部分:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <version>1.11</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <complianceLevel>1.8</complianceLevel>
    <aspectLibraries>
      <aspectLibrary>
        <groupId>com.example</groupId>
        <artifactId>example-aspects</artifactId>
      </aspectLibrary>
    </aspectLibraries>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>test-compile</goal>
      </goals>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.13</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjtools</artifactId>
      <version>1.8.13</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <version>5.1.1</version>
    </dependency>
  </dependencies>
</plugin>

...但这没有什么区别。

有没有一种方法可以在不需要添加依赖项的情况下完成这项工作?如果存在用第三方注释(如果存在)注释的方法,我几乎希望切入点能够工作,否则将被忽略。

(出于 junit 示例的目的,我构建该示例是为了确认它与我的实际问题相同,我的方面库确实声明了对 junit-jupiter-params 的依赖关系。)

最佳答案

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

<小时/>

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

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

如果您可以选择使用 AspectJ 编译器编译其他项目,我还建议您查看 @DeclareError@DeclareWarning。它将帮助您强制执行在编译期间不使用参数化测试的策略,而不是在运行时抛出错误或记录某些内容。 AspectJ 编译器不会使用该注释来编译测试。

关于java - 来自可选依赖项的 Aspectj 切入点目标注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54526066/

相关文章:

java - AspectJ @DeclareMixin,未由接口(interface)声明的方法不会被编织

java - AspectJ - 来自外部 JAR 的方面

java - Android 应用程序教程 content.xml 和 activity.xml 文件与教程有不同的代码

java - 我如何在 Java 中返回 boolean 值?

java - 如何观察整个 Camel 路线

java - 方法参数aspectj在Spring Boot中不起作用

java - 如果应用程序关闭,每 15 分钟 Android 通知就会崩溃一次

java - 如何通过编辑 JTable 行来添加表模型值?

eclipse - 使用AspectJ配置进行Eclipse Gradle导入