Maven Jacoco Configuration - Exclude classes/packages from report not working

229,159

Solution 1

Your XML is slightly wrong, you need to add any class exclusions within an excludes parent field, so your above configuration should look like the following as per the Jacoco docs

<configuration>
    <excludes>
        <exclude>**/*Config.*</exclude>
        <exclude>**/*Dev.*</exclude>
    </excludes>
</configuration>

The values of the exclude fields should be class paths (not package names) of the compiled classes relative to the directory target/classes/ using the standard wildcard syntax

*   Match zero or more characters
**  Match zero or more directories
?   Match a single character

You may also exclude a package and all of its children/subpackages this way:

<exclude>some/package/**/*</exclude>

This will exclude every class in some.package, as well as any children. For example, some.package.child wouldn't be included in the reports either.

I have tested and my report goal reports on a reduced number of classes using the above.

If you are then pushing this report into Sonar, you will then need to tell Sonar to exclude these classes in the display which can be done in the Sonar settings

Settings > General Settings > Exclusions > Code Coverage

Sonar Docs explains it a bit more

Running your command above

mvn clean verify

Will show the classes have been excluded

No exclusions

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 37 classes

With exclusions

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 34 classes

Hope this helps

Solution 2

Though Andrew already answered question with details , i am giving code how to exclude it in pom

           <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <configuration>
                    <excludes>
                        <exclude>**/*com/test/vaquar/khan/HealthChecker.class</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <!-- prepare agent for measuring integration tests -->
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

For Springboot application

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                       <!-- Exclude class from test coverage -->
                        <exclude>**/*com/khan/vaquar/Application.class</exclude>
                        <!-- Exclude full package from test coverage -->
                        <exclude>**/*com/khan/vaquar/config/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

Solution 3

Another solution:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.5.201505241946</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>
        <execution>
            <id>default-check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule implementation="org.jacoco.maven.RuleConfiguration">
                        <excludes>
                            <exclude>com.mypackage1</exclude
                            <exclude>com.mypackage2</exclude>
                        </excludes>
                        <element>PACKAGE</element>
                        <limits>
                            <limit implementation="org.jacoco.report.check.Limit">
                                <counter>COMPLEXITY</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>0.85</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

Please note that, we are using "<element>PACKAGE</element>" in the configuration which then helps us to exclude at package level.

Solution 4

you can configure the coverage exclusion in the sonar properties, outside of the configuration of the jacoco plugin:

...
<properties>
    ....
    <sonar.exclusions>
        **/generated/**/*,
        **/model/**/*
    </sonar.exclusions>
    <sonar.test.exclusions>
        src/test/**/*
    </sonar.test.exclusions>
    ....
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.coverage.exclusions>
        **/generated/**/*,
        **/model/**/*
    </sonar.coverage.exclusions>
    <jacoco.version>0.7.5.201505241946</jacoco.version>
    ....
</properties>
....

and remember to remove the exclusion settings from the plugin

Solution 5

Some Examples from the SonarQube Docs: enter image description here

Share:
229,159
resilva87
Author by

resilva87

I'm a software engineer with 10 years of experience. Most of the time I write code as backend software engineering using several languages and technologies. I had an exciting experience as a volunteer Python developer in the open-source Fedora project (https://getfedora.org/). I love science and hope to learn more about our world, nature, and life.

Updated on July 08, 2022

Comments

  • resilva87
    resilva87 almost 2 years

    I have a maven multi-module project and I'm using jacoco-maven for code coverage reports. Some classes should not be reported, as they're Spring configuration and I'm not interested in them.

    I have declared the maven-jacoco plugin as follow:

    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.2.201409121644</version>
    <configuration>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
        <exclude>some.package.*</exclude>
        <exclude>**/*Config.*</exclude>
        <exclude>**/*Dev.*</exclude>
        <exclude>some/package/SomeClass.java</exclude>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
    </plugin>
    

    The problem is that when I execute mvn clean verify jacoco still reports classes that should have been excluded as my xml configuration points out. How can I configure it properly?

  • Stephane
    Stephane almost 8 years
    I had to upgrade the Jacoco plugin from version 0.7.5 to 0.7.6 to get the exclude to be taken into account.
  • Stephane
    Stephane almost 8 years
    By the way. you'd have an idea on displaying my tests in the jacoco-it folder ? stackoverflow.com/questions/37485133/…
  • Stephane
    Stephane almost 8 years
    I wonder how to exclude, not source code classes, but test classes.
  • markdsievers
    markdsievers almost 8 years
    Great tip regarding Sonar. Easy to assume that JaCoCo exclusions will automagically propogate to Sonar (like I did).
  • Adam Arold
    Adam Arold almost 8 years
    If I exclude a file form jacoco it shows up in the coverage report with 0% coverage. So basically I get worse results compared to no exclude. Can this be fixed?
  • ThomasRS
    ThomasRS over 7 years
    Remember to use slash between filenames and not dot. Also, file ending is .class and not .java.
  • oborovyk
    oborovyk about 7 years
    If you have a report with 0% coverage you probably missed the reporting configuration.There should also be excludes section.
  • aloplop85
    aloplop85 almost 6 years
    I am using jacoco-maven-plugin:0.7.9. With your solution, it calculates the results correctly. However, all clases in project appear in the jacoco report (index.html). Is it possible to show in the report just what the plugin has analyzed in order to have the real value of covered ratio?
  • Vrajendra Singh Mandloi
    Vrajendra Singh Mandloi almost 6 years
    HI Vaquar, i have been beating my head for exclusion of package via jacoco maven plugin. I do not want to show Excluded packages on Index.html which is created.. if you have the code with you can do the same, kindly help me with it. Send me the code at [email protected]
  • Updo2008
    Updo2008 over 5 years
    It seems the class path should be without .class ending, such as: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
  • Mohamed chiheb Ben jemaa
    Mohamed chiheb Ben jemaa over 5 years
    i'm using sonar-scanner with sonar-project prop file to capture jacoco report, but actually when i use this option in my pom to exclude some classes, the code coverage in sonar did not consider that, but in the build consider that why !!
  • Jim Tough
    Jim Tough almost 5 years
    This removes the entire package from the report for me: <exclude>com/mycompany/mypackage/**/*</exclude>
  • Smart Coder
    Smart Coder over 4 years
    It's important to understand the impact of ** and *. If you don't include ** and then it won't traverse into underlying directories. The * is a single character and should be used for file name purposes.
  • Smart Coder
    Smart Coder almost 4 years
    The folder structure also matters : for example : /webapp/**/* will exclude all files under webapp directory. The "" is for directory and "" is for file. If you just have **/webapp/ then it won't exclude the folders under webapp folder.
  • Wlad
    Wlad almost 4 years
    Is it possible to exclude a whole bundle? I've got a target/classes folder w/ several subfolders w/ hundreds of .class files. Another issue is that some other bundles have subfolders w/ equal names, so it's even not appropriate to exclude on subfolder level in my case. So how can I exclude a folder which is a parent of target/classes?
  • Wlad
    Wlad almost 4 years
    After Git Hell comes Jacoco Hell :)
  • Wlad
    Wlad almost 4 years
    @AdamArold w/ Jacoco version 0.8.5 excluded stuff (bundles in my case) appear as "n/a" in report and do not affect the overall coverage %.
  • Ivan
    Ivan over 2 years
    Why **/*com and not just **/com ?