Java – Jacoco SonarQube Integration

code-coveragejacocojavamaven-3sonarqube

I've spent a good couple of days trying to get SonarQube to display unit test code coverage from the Maven Jacoco plugin.

The error message I am stuck on is

[INFO] Analysing .../target/jacoco.exec
[WARNING] Coverage information was not collected. Perhaps you forget to include debug information into compiled classes?

The report under target/site/jacoco/index.html generates as expected and contains line highlighting and line numbers. I have read that if no debug information is included in the compiled classes then the highlighting and line numbers will not show in this report.

I have read Maven includes debug information by default, however, just in case I included the following configuration in my projects maven-compiler-plugin setup

<configuration>
    <debug>true</debug>
    <debuglevel>lines,vars,source</debuglevel>
</configuration>

I have the following properties in my settings.xml (host and login left out on purpose)

<properties>
    <sonar.host.url></sonar.host.url>
    <sonar.login></sonar.login>
    <sonar.ws.timeout>300</sonar.ws.timeout>
</properties>

I have the following configuration of my Jacoco plugin.

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.7.201606060606</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
             <goals>
                 <goal>report</goal>
             </goals>
        </execution>
    </executions>
</plugin>

My jacoco.exec is in the default location of target/jacoco.exec and is found correctly by SonarQube.

Relevant versions

Maven 3.2.2

Maven Compiler 3.5.1

Maven Surefire 2.19.1

Java 1.8.0_11

SonarQube Server 5.6

Jacoco Maven Plugin 0.7.7.201606060606

Mac OS X 10.10.5

Thanks in advance for the help!

—- EDIT —-

I am running the following maven commands

mvn clean package

mvn sonar:sonar

Best Answer

I have followed the article here and it just work for me, I have only updated the code to reflect the latest JaCoCo plugin version

    <dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.9</version>
    </dependency>

and adding JaCoCo agent to my POM plugins:

    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                 <executable>true</executable>
            </configuration>
        </plugin>
        <!-- JaCoCo configuration -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.9</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

and running the following maven command (in Jenkins):

clean deploy $SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL

I have SonarQube 6.3.0.19869, Jenkins 2.46.1, Maven Integration Plugin in Jenkins 2.15.1 (the older one caused JVM issues in my stack).

Related Topic