SonarCloud project says 0% coverage (Maven multimodule project)

Hi,

My SonarCloud project always shows 0% coverage, although the test and Sonar integration are set up correctly.

Since the project is private, I created the sample reproduction pack to describe the issue:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE report PUBLIC "-//JACOCO//DTD Report 1.1//EN" "report.dtd">
<report name="Test 2">
    <group name="module2">
        <package name="com/acme/module2">
            <class name="com/acme/module2/Module2" sourcefilename="Module2.java">
                <method name="&lt;init&gt;" desc="()V" line="3">
                    <counter type="INSTRUCTION" missed="3" covered="0" />
                    <counter type="LINE" missed="1" covered="0" />
                    <counter type="COMPLEXITY" missed="1" covered="0" />
                    <counter type="METHOD" missed="1" covered="0" />
                </method>
                <method name="coveredByUnitTest" desc="()V" line="6">
                    <counter type="INSTRUCTION" missed="4" covered="0" />
                    <counter type="LINE" missed="2" covered="0" />
                    <counter type="COMPLEXITY" missed="1" covered="0" />
                    <counter type="METHOD" missed="1" covered="0" />
                </method>
                <method name="coveredByIntegrationTest" desc="()V" line="10">
                    <counter type="INSTRUCTION" missed="4" covered="0" />
                    <counter type="LINE" missed="2" covered="0" />
                    <counter type="COMPLEXITY" missed="1" covered="0" />
                    <counter type="METHOD" missed="1" covered="0" />
                </method>
                <method name="uncovered" desc="()V" line="14">
                    <counter type="INSTRUCTION" missed="4" covered="0" />
                    <counter type="LINE" missed="2" covered="0" />
                    <counter type="COMPLEXITY" missed="1" covered="0" />
                    <counter type="METHOD" missed="1" covered="0" />
                </method>
                <counter type="INSTRUCTION" missed="15" covered="0" />
                <counter type="LINE" missed="7" covered="0" />
                <counter type="COMPLEXITY" missed="4" covered="0" />
                <counter type="METHOD" missed="4" covered="0" />
                <counter type="CLASS" missed="1" covered="0" />
            </class>
            <sourcefile name="Module2.java">
                <line nr="3" mi="3" ci="0" mb="0" cb="0" />
                <line nr="6" mi="3" ci="0" mb="0" cb="0" />
                <line nr="7" mi="1" ci="0" mb="0" cb="0" />
                <line nr="10" mi="3" ci="0" mb="0" cb="0" />
                <line nr="11" mi="1" ci="0" mb="0" cb="0" />
                <line nr="14" mi="3" ci="0" mb="0" cb="0" />
                <line nr="15" mi="1" ci="0" mb="0" cb="0" />
                <counter type="INSTRUCTION" missed="15" covered="0" />
                <counter type="LINE" missed="7" covered="0" />
                <counter type="COMPLEXITY" missed="4" covered="0" />
                <counter type="METHOD" missed="4" covered="0" />
                <counter type="CLASS" missed="1" covered="0" />
            </sourcefile>
            <counter type="INSTRUCTION" missed="15" covered="0" />
            <counter type="LINE" missed="7" covered="0" />
            <counter type="COMPLEXITY" missed="4" covered="0" />
            <counter type="METHOD" missed="4" covered="0" />
            <counter type="CLASS" missed="1" covered="0" />
        </package>
        <counter type="INSTRUCTION" missed="15" covered="0" />
        <counter type="LINE" missed="7" covered="0" />
        <counter type="COMPLEXITY" missed="4" covered="0" />
        <counter type="METHOD" missed="4" covered="0" />
        <counter type="CLASS" missed="1" covered="0" />
    </group>
    <counter type="INSTRUCTION" missed="15" covered="0" />
    <counter type="LINE" missed="7" covered="0" />
    <counter type="COMPLEXITY" missed="4" covered="0" />
    <counter type="METHOD" missed="4" covered="0" />
    <counter type="CLASS" missed="1" covered="0" />
</report>
  • The content of target/sonar/scanner-report/analysis.log
SonarCloud plugins:
  - Text Code Quality and Security 2.37.0.10259 (textenterprise)
  - IaC Code Quality and Security 2.4.0.18716 (iac)
Project server settings:
  - sonar.abap.file.suffixes=.abap,.ab4,.flow,.asprog
  - sonar.apex.file.suffixes=.cls,.trigger
  - sonar.autoscan.enabled=false
  - sonar.azureresourcemanager.file.suffixes=.bicep
  - sonar.c.file.suffixes=.c,.h
  - sonar.cpp.file.suffixes=.cc,.cpp,.cxx,.c++,.hh,.hpp,.hxx,.h++,.ipp,.ixx,.mxx,.cppm,.ccm,.cxxm,.c++m
  - sonar.cs.file.suffixes=.cs,.razor
  - sonar.css.file.suffixes=.css,.less,.scss,.sass
  - sonar.dart.file.suffixes=.dart
  - sonar.docker.file.patterns=*.dockerfile,Dockerfile,dockerfile
  - sonar.flex.file.suffixes=as
  - sonar.go.file.suffixes=.go
  - sonar.html.file.suffixes=.html,.xhtml,.cshtml,.vbhtml,.aspx,.ascx,.rhtml,.erb,.shtm,.shtml,.cmp,.twig
  - sonar.ipynb.file.suffixes=ipynb
  - sonar.java.file.suffixes=.java,.jav
  - sonar.java.jvmframeworkconfig.file.patterns=**/src/main/resources/**/*app*.properties,**/src/main/resources/**/*app*.yaml,**/src/main/resources/**/*app*.yml
  - sonar.javascript.file.suffixes=.js,.jsx,.cjs,.mjs,.vue
  - sonar.jcl.file.suffixes=.jcl
  - sonar.json.file.suffixes=.json
  - sonar.jsp.file.suffixes=.jsp,.jspf,.jspx
  - sonar.kotlin.file.suffixes=.kt,.kts
  - sonar.objc.file.suffixes=.m
  - sonar.php.file.suffixes=php,php3,php4,php5,phtml,inc
  - sonar.pli.file.suffixes=.pli
  - sonar.plsql.file.suffixes=sql,tab,pkb
  - sonar.python.file.suffixes=py
  - sonar.rpg.file.suffixes=.rpg,.rpgle,.sqlrpgle,.RPG,.RPGLE,.SQLRPGLE
  - sonar.ruby.file.suffixes=.rb
  - sonar.rust.file.suffixes=.rs
  - sonar.scala.file.suffixes=.scala
  - sonar.shell.file.suffixes=.sh,.bash
  - sonar.swift.file.suffixes=.swift
  - sonar.terraform.file.suffixes=.tf
  - sonar.tsql.file.suffixes=.tsql
  - sonar.typescript.file.suffixes=.ts,.tsx,.cts,.mts
  - sonar.vb.file.suffixes=.bas,.frm,.ctl
  - sonar.vbnet.file.suffixes=.vb
  - sonar.xml.file.suffixes=.xml,.xsd,.xsl,.config
  - sonar.yaml.file.suffixes=.yaml,.yml
Project scanner properties:
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/target/site/jacoco-aggregate/jacoco.xml
  - sonar.host.url=https://sonarcloud.io
  - sonar.java.libraries=/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.java.test.libraries=/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar,/Users/duy.lam/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar,/Users/duy.lam/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
  - sonar.libraries=/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.links.ci=
  - sonar.links.homepage=
  - sonar.links.issue=
  - sonar.links.scm=
  - sonar.links.scm_dev=
  - sonar.log.level=DEBUG
  - sonar.moduleKey=maven-multimodule
  - sonar.modules=org.sonarqube:module1,org.sonarqube:module2,org.sonarqube:tests
  - sonar.organization=duylam-katalon
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/target
  - sonar.projectKey=maven-multimodule
  - sonar.projectName=Example of multi-module Maven project
  - sonar.projectVersion=1.0-SNAPSHOT
  - sonar.scanner.apiBaseUrl=https://api.sonarcloud.io
  - sonar.scanner.app=ScannerMaven
  - sonar.scanner.appVersion=5.2.0.4988/3.9.11
  - sonar.scanner.arch=arm64
  - sonar.scanner.os=macos
  - sonar.scanner.sonarcloudUrl=https://sonarcloud.io
  - sonar.scanner.truststorePassword=******
  - sonar.scanner.truststorePath=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home/lib/security/cacerts
  - sonar.scanner.wasEngineCacheHit=true
  - sonar.scanner.wasJreCacheHit=HIT
  - sonar.sourceEncoding=UTF-8
  - sonar.sources=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/pom.xml
  - sonar.token=******
  - sonar.verbose=true
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/target/sonar
Scanner properties of module: org.sonarqube:module1
  - sonar.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/classes
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/site/jacoco-aggregate/jacoco.xml
  - sonar.groovy.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/classes
  - sonar.java.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/classes
  - sonar.java.jdkHome=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home
  - sonar.java.source=1.8
  - sonar.java.target=1.8
  - sonar.java.test.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/classes,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar,/Users/duy.lam/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar,/Users/duy.lam/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest...
  - sonar.moduleKey=org.sonarqube:module1
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target
  - sonar.projectKey=org.sonarqube:module1
  - sonar.projectName=Module 1
  - sonar.sources=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/pom.xml,/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/src/main/java
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/sonar
Scanner properties of module: org.sonarqube:module2
  - sonar.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/classes
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/site/jacoco-aggregate/jacoco.xml
  - sonar.groovy.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/classes
  - sonar.java.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/classes
  - sonar.java.jdkHome=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home
  - sonar.java.source=1.8
  - sonar.java.target=1.8
  - sonar.java.test.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/classes,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar,/Users/duy.lam/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar,/Users/duy.lam/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest...
  - sonar.moduleKey=org.sonarqube:module2
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target
  - sonar.projectKey=org.sonarqube:module2
  - sonar.projectName=Module 2
  - sonar.sources=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/pom.xml,/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/src/main/java
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/sonar
Scanner properties of module: org.sonarqube:test2
  - sonar.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/classes
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/site/jacoco-aggregate/jacoco.xml
  - sonar.groovy.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/classes
  - sonar.java.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/classes
  - sonar.java.jdkHome=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home
  - sonar.java.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/module2-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.java.source=1.8
  - sonar.java.target=1.8
  - sonar.java.test.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/test-classes
  - sonar.java.test.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/classes,/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/module2-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2...
  - sonar.junit.reportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/surefire-reports
  - sonar.junit.reportsPath=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/surefire-reports
  - sonar.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module2/target/module2-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.moduleKey=org.sonarqube:test2
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target
  - sonar.projectKey=org.sonarqube:test2
  - sonar.projectName=Test 2
  - sonar.tests=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/src/test/java
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test2/target/sonar
Scanner properties of module: org.sonarqube:tests
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/target/site/jacoco-aggregate/jacoco.xml
  - sonar.moduleKey=org.sonarqube:tests
  - sonar.modules=org.sonarqube:test1,org.sonarqube:test2
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/target
  - sonar.projectKey=org.sonarqube:tests
  - sonar.projectName=Tests
  - sonar.sources=
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/target/sonar
Scanner properties of module: org.sonarqube:test1
  - sonar.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/classes
  - sonar.coverage.jacoco.xmlReportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/site/jacoco-aggregate/jacoco.xml
  - sonar.groovy.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/classes
  - sonar.java.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/classes
  - sonar.java.jdkHome=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home
  - sonar.java.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/module1-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.java.source=1.8
  - sonar.java.target=1.8
  - sonar.java.test.binaries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/test-classes
  - sonar.java.test.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/classes,/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/module1-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2...
  - sonar.junit.reportPaths=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/surefire-reports
  - sonar.junit.reportsPath=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/surefire-reports
  - sonar.libraries=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/module1/target/module1-1.0-SNAPSHOT.jar,/Users/duy.lam/.m2/repository/com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar,/Users/duy.lam/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar,/Users/duy.lam/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,/Users/duy.lam/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar,/Users/duy.lam/.m2/repository/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar,/Users/duy.lam/.m2/repository/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar,/Users/duy.lam/.m2/repository/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar
  - sonar.moduleKey=org.sonarqube:test1
  - sonar.projectBaseDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1
  - sonar.projectBuildDir=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target
  - sonar.projectKey=org.sonarqube:test1
  - sonar.projectName=Test 1
  - sonar.tests=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/src/test/java
  - sonar.working.directory=/Users/duy.lam/projects/oss/katalon-sonar-scanning-examples/sonar-scanner-maven/maven-multimodule/tests/test1/target/sonar

The JaCoCo coverage report sees the coverage of the app code (module1, module2), but Sonar doesn’t. I don’t know what configuration goes wrong here

Thanks for your help

Duy

Hi Duy,

Can you add -X to your Maven command and provide the logs here, redacted as necessary?

 
Thx,
Ann

Thanks @ganncamp

Attachment is the Maven console output with -X

mvn.log (1.2 MB)

Hi Duy,

Thanks for the log and for all the work you’ve put into this report.

The log shows analysis finding your coverage report for each module. What I expected it to show - and it does not - is a path mismatch between what’s in the coverage report and what analysis sees.

Since the log isn’t terribly helpful here, I’m going to call in the experts.

 
Ann

1 Like

Hi @duy.lam,

Thank you for reaching out. Unfortunately, our solution does not deal well with aggregate JaCoCo reports but the good news is that we are working on improving the support of the situation. The situation should impove in a coming release.

I am assuming using an aggregate report for coverage is the best way to go for your project but I will still ask: Could your project be configured to user per module coverage?

Cheers,

Dorian

1 Like

@Dorian_Burihabwa

The situation should impove in a coming release.

Thanks for the useful update. Initially, I thought this feature was available, and I had something wrong in the Sonar config

Could your project be configured to user per module coverage?

Just to make sure I understand the question, the ideal outcome would be: for a multi-module Maven project type, the Sonar Maven plugin (Scanner) sees a list of JaCoCo coverate report from test projects (files target/site/jacoco-aggregate/jacoco.xml) as the input, and then on the Sonar Cloud project view, it can display the coverage on the app code in the Sonar project level, like in the Code view or Quality Gate on New Code/Overall Code (screenshots below)

Of course, the other code analysis (for code issues in existing categories like Security, Reliability, etc.) is still there for each app code module i.e. valid values for sonar.sources, sonar.inclusion, etc.

Is it a valid answer? I’m happy to support any concerns for this use case

Duy

@Dorian_Burihabwa @ganncamp Update

The problem is solved. It turns out that the coverage on Sonar will work when the JaCoCo report file

  • produced by the report goal (not report-aggregate one)
  • located under the app module i.e. module2/target/site/jacoco/jacoco.xml)

It seems this is undocumented in the Sonar doc (for the Java multimodule Maven). I will submit a PR to the Sonar sample code repo to help others who may be in the same situation

Duy

1 Like

Here is the complete demo to solve the coverage problem Demo Code Coverage on Sonar server for multi-module Maven project by duylam-katalon · Pull Request #221 · SonarSource/sonar-scanning-examples · GitHub

1 Like

Thanks for the contribution @duy.lam :folded_hands: . I will have a look and see how we can get your contribution merged.

2 Likes

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.