AspectJ切入点靶向注释从可选的依赖

问题描述 投票:1回答:1

我使用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木星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的木星-PARAMS的依赖。)

java aspectj aspectj-maven-plugin
1个回答
0
投票

您方面使用类虽然您的示例代码不会表现出来,必须有一个导入它在你的方面上。这意味着,它绝对是一个依赖 - 而不是一个可选的一个 - 为您的方面库。因此,你有你的图书馆的Maven的POM来定义它是这样。别的只是没有任何意义。有什么大不了的,无论如何定义它?适当的依赖管理是什么的Maven被造的。


更新:感谢您的澄清意见。

你可以使用,而不是本机语法基于注释的语法,因为它不需要进口。切入点只想不匹配,另一个Xlint警告会再展。

如果你有编译其它项目,AspectJ编译器的选项,我还建议你寻找到@DeclareError@DeclareWarning。它会帮助你执行政策不编译,而不是在运行时引发错误或记录的东西时使用parametrised测试。 AspectJ编译器将只是没有编译使用注解测试。

© www.soinside.com 2019 - 2024. All rights reserved.