从 Sonar 覆盖报告中排除 Lombok 类

Excluding Lombok classes from Sonar coverage report

最新的Jacoco插件(仍然是快照版本,0.7.10-SNAPSHOT),有一个很好的新功能来过滤掉Lombok生成的代码(https://github.com/jacoco/jacoco/wiki/FilteringOptions) . 我们需要做的就是在存储库的根目录添加一个 lombok.config 文件:

lombok.addLombokGeneratedAnnotation=true 

当我在内部生成 Jacoco 报告时,我看到了不同之处。 但是,当我执行常规质量作业并将结果发布到 Sonar 时,我得到了不同的(即更差的)结果。

为什么我的本地报告和 Sonar 的结果不一样?有什么解决方法吗?

正如这里提到的:https://github.com/jacoco/jacoco/pull/513#issuecomment-293176354

过滤是在报告生成时执行的(创建html、xml等),而不是在收集执行信息时(创建exec文件)。因此,那些直接读取执行数据而不是读取 xml 的工具(这对他们来说是一种错误,依赖于纯粹的内部中间格式,但已经完成了)并创建自己的报告(例如 SonarQube ,Jenkins 等)将需要在 JaCoCo 发布后更新它们对 JaCoCo 的依赖,以便对报告进行过滤。当我们的发布完成时,我们将明确通知下游项目(特别是上面提到的所有项目)。所以再一次 - 请耐心等待。感谢您的理解。

我没有找到让 Sonar 读取结束报告而不是 exec 文件的方法,所以我想我们需要耐心等待官方 0.7.10 jacoco 插件发布,然后更新 Sonar边 !

------ 2018 年 5 月 9 日更新

新版本已经发布,我可以确认它适合我。

使用:

  • 声纳 6.7
  • SonarJava 插件 5.1.1.13214
  • jacoco maven 插件 0.8.1
  • lombok.addLombokGeneratedAnnotation=真 lombok.config

我现在向 Sonar 报告了更好的覆盖率结果,因为 Lombok 生成的代码现在被忽略了。它确实有助于确定 "real" 未覆盖的区域是什么,以及它是否有风险。

首先你必须检查你的lombok版本至少是1.16.14

pom.xml:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
    <version>1.16.14</version>
</dependency>

然后你要检查你的Jacoco版本至少是0.8.0

pom.xml:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.0</version>
    <!-- // -->
</plugin>

然后你必须在项目的 src 文件夹中添加一个 lombok.config 文件(不在 resources 文件夹中

lombok.config:

# tells Lombok that this is the root directory and that it shouldn’t search parent directories for more configuration files
config.stopBubbling = true
# tells Lombok to add @lombok.Generated annotation to all generated methods
lombok.addLombokGeneratedAnnotation = true