OpenClover - 掌握AspectJ的工作(OpenClover - Getting to

2019-11-04 19:38发布

我试图与使用的AspectJ项目和仪器方面的使用Openclover到其代码。

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 ,用于广田编译器的包装,它允许代码执行使用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工作,并没有在网络上有很大帮助。

谢谢

Answer 1:

正如我们讨论的意见,你可以使用AspectJ的Maven的 ,而不是三叶草的AspectJ 。 你只需要采取以得到它的工作的几个注意事项:

  • 我喜欢把AspectJ的Maven的执行到process-sources阶段,以确保AspectJ编译器踢前的正常Java编译器通过的Maven Compiler插件拉开序幕。 你也可以关闭Maven的编译器,而不是为浓缩苹果汁是一种全取代javac。 其实这个阶段曾经是中老年的插件版本中的默认,但它已被早就改变了 ,这是在还提到对SO答案 。

  • 有一个在Maven的编译器,即开关问题useIncrementalCompilation似乎已经颠倒逻辑。 这就是为什么你需要将其设置为false ,以使其发挥作用。 否则,它会尝试重新编译已由AspectJ的编译的东西,打破方面编织。 见MCOMPILER-209和MCOMPILER-194 ,我解释这个问题和它在我的职位有解决方案。

  • 现在实际上与OpenClover(OC)的唯一问题:AspectJ的(AJ)不知道OC为了使代码覆盖率添加源代码到每个方法什么。 不幸的是OC也不知道AJ,也增加了代码定义为一个空方法的注释风格的切入点@Pointcut注解。 由于OC需要做它的魔力AJ编译前,AJ编译器抱怨的切入点发现意外的代码并停止编译一个错误。 至少有两种方法来避免:

    • 您可以在线所有切入点到相应的@Before@After@Around等使用它们,通常工作,但并非总是在你需要的参数,以实现像虫洞格局切入点结合的情况下的选择建议execution(pointcutA()) && cflow(execution(pointcutB(myArgument)))

    • 或者你也可以排除OC仪器,如果他们居住在一个包凡有需要加以仪表没有其他的Java类,这是最容易的各个方面。 然后你可以使用一个简单的排斥像你的情况<exclude>codeaspects/**</exclude> 。 这是我在做什么,我拉的请求固定项目时。

    • 最简单的方法是只重命名来自各方面的*.java*.aj ,这是无论如何命名他们的正规途径。 我只是想在你的项目,它精美的作品。 AspectJ的Maven的查找这些文件,无论如何,但OC会忽略他们,甚至没有计算它们的代码行缺少覆盖。 您也可以摆脱<exclude>上面提到的,看到这个承诺 。

也许所有这一切都是自动三叶草AspectJ的照顾,我从来没有尝试过。 也许这编译器包装的作者实际上应该解释它能做什么以及它是如何工作的文件中,特别是如何与Maven使用它。 否则,它没有太大的意义来使用它。



文章来源: OpenClover - Getting to work with AspectJ