Java 忽略jacoco分析的声纳jacoco传感器

Java 忽略jacoco分析的声纳jacoco传感器,java,maven,sonarqube,Java,Maven,Sonarqube,我有一个多模块maven项目,它既有模块内单元测试,也有端到端服务测试(不完全是集成测试,因为它们实际上没有与任何东西集成),我们在其中模拟被测试的特定服务的边界。后一组测试(使用mockmvc在部署前测试所有层)生成一个jacoco.exec(或jacoco-it.exec,具体取决于我尝试的maven配置),它清楚地表明测试有助于提高代码覆盖率。事实上,绝大多数覆盖范围都在这一层(每个jacoco大约40%) 当我在本地或通过jenkins对项目进行声纳分析时,我得到了以下顶级测试结果: [

我有一个多模块maven项目,它既有模块内单元测试,也有端到端服务测试(不完全是集成测试,因为它们实际上没有与任何东西集成),我们在其中模拟被测试的特定服务的边界。后一组测试(使用mockmvc在部署前测试所有层)生成一个jacoco.exec(或jacoco-it.exec,具体取决于我尝试的maven配置),它清楚地表明测试有助于提高代码覆盖率。事实上,绝大多数覆盖范围都在这一层(每个jacoco大约40%)

当我在本地或通过jenkins对项目进行声纳分析时,我得到了以下顶级测试结果:

[信息]传感器[java]

[信息]分析 /用户/tokkov/Documents/workspace/platform/customer/assemblies/service/target/jacoco.exec

[警告]未收集覆盖范围信息。也许你忘了 要将调试信息包含到编译类中

[信息]传感器[java](完成)|时间=164ms

所以声纳找到了jacoco分析。它找到编译后的代码(将JAR解包到构建目录中,并使用sonar.java.binaries指定位置),编译后的代码确实有调试信息(使用javap-l进行验证),但它仍然举手继续

你知道为什么sonar忽略了jacoco的报告吗?我是否缺少某个配置?它很高兴地吞噬了其他模块中的所有jacoco.exec报告,而不是这一个

<sonar.java.binaries>${project.build.directory}/class-fix</sonar.java.binaries>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPaths>${project.build.directory}/jacoco.exec</sonar.jacoco.reportPaths>
${project.build.directory}/class-fix
再利用报告
${project.build.directory}/jacoco.exec
版本:
Sonarqube V7.1(build 11001),JaCoCo maven插件V0.8.1

这是pom.xml中适合我的配置:

    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
jacoco
再利用报告
${project.basedir}/./target/jacoco.exec
JAVA
以及同一pom.xml中的jacoco插件设置:

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.1</version>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
                <append>true</append>
            </configuration>
            <executions>
                <execution>
                    <id>agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

org.jacoco
jacocomaven插件
0.8.1
${sonar.jacoco.reportPath}
真的
代理人
配制剂

问题似乎在于嵌套maven模块。项目结构在本质上是高度嵌套的,我相信这有助于在思想上加强他们正在实施的六边形体系结构的分离。这导致了几个只包含其他模块的模块,而sonar插件似乎在代码的关联中迷失了方向。一旦我删除了任何不包含代码的模块,将文件夹结构扁平化一点,报告就完成了

在第二个项目中,我指定使用一个jacoco.exec文件,以便jacoco可以在sonar参与之前对其进行聚合。这也解决了这个问题,并允许团队保留高度嵌套的maven结构

在这两种情况下,问题似乎是sonar不处理覆盖范围目的的跨模块代码引用,除非在sonar分析之前对jacoco结果进行汇总

这是端到端服务测试中的一个重要问题,它会破坏代码分离到离散模块的好处

tl;博士
Sonar无法处理多层嵌套maven模块。并且完全忽略了包含测试的模块之外的代码。

这几乎就是我的代码。问题根本不是jacoco插件。这很有效。如果我使用创建的jacoco.exec文件生成一个html报告,它会像我期望的那样显示所有代码覆盖率。问题是sonar不想使用jacoco报告。你设置了jacoco吗?是的,我也尝试过设置覆盖插件,但没有成功。我唯一能做的事情就是为每个模块生成源jar,然后将它们解压缩到目标目录中,并告诉sonar去那里查看。很明显,这个来源是存在的,所以声纳很高兴。然而,现在(正确地)报告的代码行数是原来的两倍,所以我的实际覆盖率是原来的一半。因此,这并不是一个真正的选项。请添加
maven编译器插件的配置
,定义属性和目标,以构建和扫描项目。