Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Aspectj切入点从可选依赖项中设置注释的目标_Java_Aspectj_Aspectj Maven Plugin - Fatal编程技术网

Java Aspectj切入点从可选依赖项中设置注释的目标

Java Aspectj切入点从可选依赖项中设置注释的目标,java,aspectj,aspectj-maven-plugin,Java,Aspectj,Aspectj Maven Plugin,我正在使用aspectj以使用第三方注释的方法为目标。但是,我不能保证该注释在类路径上可用。有没有一种方法可以从可选依赖项中定位注释 例如,我可能希望以JUnit5的@ParameterizedTest注释为目标。我的.aj文件如下所示: public aspect Example { pointcut beforeTest(): @annotation(ParamterizedTest); before(): beforeTest() { System.out.println

我正在使用aspectj以使用第三方注释的方法为目标。但是,我不能保证该注释在类路径上可用。有没有一种方法可以从可选依赖项中定位注释

例如,我可能希望以JUnit5的
@ParameterizedTest
注释为目标。我的.aj文件如下所示:

public aspect Example {
  pointcut beforeTest(): @annotation(ParamterizedTest);

  before(): beforeTest() {
    System.out.println("This is a Parameterized Test!");
  }
}
<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 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插件的
部分,如下所示:

public aspect Example {
  pointcut beforeTest(): @annotation(ParamterizedTest);

  before(): beforeTest() {
    System.out.println("This is a Parameterized Test!");
  }
}
<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>

org.codehaus.mojo
aspectj maven插件
1.11
1.8
1.8
1.8
com.example
示例方面
测试编译
org.aspectj
aspectjrt
1.8.13
org.aspectj
aspectjtools
1.8.13
org.junit.jupiter
朱尼特朱庇特酒店
5.1.1
。。。但这没什么区别

有没有一种方法可以在不需要添加依赖项的情况下实现这一点?如果有使用第三方注释(如果存在)注释的方法,我非常希望切入点起作用,否则将被忽略


(对于junit示例,我构建该示例是为了确认它的工作原理与我的实际问题相同,我的方面库确实声明了对junit jupiter参数的依赖关系。)

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


更新:感谢您的澄清评论

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


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

您的方面使用该类,即使您的示例代码没有显示该类,也必须在您的方面之上为其导入。这意味着它肯定是方面库的依赖项,而不是可选依赖项。因此,您必须在库的Maven POM中定义它。其他任何事情都没有意义。定义它到底有什么大不了的?适当的依赖关系管理是Maven的初衷


更新:感谢您的澄清评论

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


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

MyAspect使用该类。继承方面库的完全独立的项目可能使用该类,也可能不使用该类。我想做的是检测我的雇主不希望我们使用的注释的使用情况。如果不使用注释,那就太好了。如果注释甚至没有包含在项目的依赖项中,那就太好了。我以JUnit 5为例——如果标识JUnit 5类的方面库被用于一个单独的项目中,该项目没有JUnit 5依赖项,因为它使用的是4,那么aspectJ编译器将无法编译该项目。我的方面使用该类。继承方面库的完全独立的项目可能使用该类,也可能不使用该类。我想做的是检测我的雇主不希望我们使用的注释的使用情况。如果不使用注释,那就太好了。如果注释甚至没有包含在项目的依赖项中,那就太好了。我以JUnit 5为例——如果标识JUnit 5类的方面库被用于一个单独的项目中,该项目没有JUnit 5依赖项,因为它使用的是4,那么aspectJ编译器将无法编译该项目。