gpt4 book ai didi

java - OpenClover - 开始使用 AspectJ

转载 作者:行者123 更新时间:2023-12-02 11:08:37 25 4
gpt4 key购买 nike

我正在尝试将 Openclover 与使用 AspectJ 的项目一起使用,并将各个方面插入到其代码中。

pom.xml 具有与 AspectJ 相关的以下依赖项:

...
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
<scope>provided</scope>
</dependency>
</dependencies>
...

还有这些插件:

    <plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>

<plugin>
<groupId>org.openclover</groupId>
<artifactId>clover-aspectj-compiler</artifactId>
<version>1.0.0</version>
</plugin>

<plugin>
<groupId>org.openclover</groupId>
<artifactId>clover-maven-plugin</artifactId>
<version>4.2.0</version>
<executions>
<execution>
<id>clover</id>
<phase>verify</phase>
<goals>
<goal>instrument</goal>
<goal>clover</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>

我使用两个插件来执行此操作:clover-maven-plugin(一个代码覆盖工具)和 clover-aspectj-compiler(AspectJ 编译器的包装器)它允许使用 OpenClover 进行代码检测。

我得到的错误如下:

[ERROR] QueryAspect.java:48:0::0 The type QueryAspect is already defined
[ERROR] LogAspect.java:35:0::0 The type LogAspect is already defined

关于此的文档太少(或者更好,没有),我似乎无法使 AspectJ 与 OpenClover 一起工作,并且网络上也没有太多帮助。

谢谢

最佳答案

正如我们评论中所讨论的,您可以使用 AspectJ Maven而不是Clover AspectJ 。您只需采取一些预防措施即可使其正常工作:

  • 我喜欢将 AspectJ Maven 执行放入 process-sources阶段,以确保 AspectJ 编译器在 Maven 编译器插件启动普通 Java 编译器之前启动。您还可以停用 Maven 编译器,因为 Ajc 是 Javac 的完全替代品。实际上,该阶段曾经是旧插件版本中的默认阶段,但它已经是 changed long agoanswer on SO 中也提到了这一点。另请参阅MASPECTJ-13为什么它被改变和 MASPECTJ-92为什么改变是一个坏主意。

  • Maven编译器有问题,即开关useIncrementalCompilation似乎逻辑颠倒了。这就是为什么您需要将其设置为 false为了让它发挥作用。否则,它会尝试重新编译已由 AspectJ 编译的内容,从而破坏切面编织。请参阅MCOMPILER-209MCOMPILER-194 ,我在我的帖子中解释了问题及其解决方案。

  • 现在唯一与 OpenClover (OC) 相关的问题是:AspectJ (AJ) 不知道 OC 向每个方法添加源代码以实现代码覆盖率。不幸的是,OC 也不了解 AJ,并且还向定义为带有 @Pointcut 的空方法的注释式切入点添加代码。注解。由于 OC 需要在 AJ 编译之前发挥其魔力,因此 AJ 编译器会提示在切入点中发现意外代码,并因错误而停止编译。至少有两种方法可以避免这种情况:

    • 您可以将所有切入点内联到相应的 @Before 中。 , @After , @Around使用它们的建议,通常有效,但在需要在切入点中进行参数绑定(bind)以实现像 execution(pointcutA()) && cflow(execution(pointcutB(myArgument))) 这样的虫洞模式的情况下,并不总是一个选择.

    • 或者,您可以从 OC 检测中排除所有方面,如果它们驻留在一个包中,并且没有其他需要检测的 Java 类,这是最简单的。然后您可以使用简单的排除,如您的情况 <exclude>codeaspects/**</exclude> 。这就是我在 pull request 中所做的事情修复您的项目时。

    • 最简单的方法就是重命名 *.java 中的所有方面。至*.aj ,无论如何,这是命名它们的规范方式。我刚刚在你的项目中尝试过,效果非常好。 AspectJ Maven 无论如何都会查找这些文件,但 OC 会忽略它们,甚至不计算它们的代码行是否缺少覆盖范围。您还可以摆脱 <exclude>上面提到的,参见this commit .

也许这一切都是由 Clover AspectJ 自动处理的,我从未尝试过。也许该编译器包装器的作者实际上应该在文档中解释它的作用和工作原理,特别是如何将它与 Maven 一起使用。否则使用它没有多大意义。

关于java - OpenClover - 开始使用 AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50744732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com