Подтвердить что ты не робот

Конфигурация Maven Jacoco - исключить классы/пакеты из отчета, не работающего

У меня есть мультимодульный проект maven, и я использую jacoco-maven для отчетов о покрытии кода. Некоторые классы не должны сообщаться, так как они Spring, и я не заинтересован в них.

Я объявил плагин maven-jacoco следующим:

<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>

Проблема в том, что когда я выполняю mvn clean verify, jacoco все еще сообщает о классах, которые должны были быть исключены, поскольку моя конфигурация xml указывает. Как я могу правильно настроить его?

4b9b3361

Ответ 1

Ваш XML-код немного ошибочен, вам нужно добавить исключения классов в исключающее родительское поле исключение, поэтому ваша вышеприведенная конфигурация должна выглядеть следующим образом: Jacoco документы

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

Значения полей exclude должны быть классами (не именами пакетов) скомпилированных классов относительно целевого каталога/классов/с использованием стандартного синтаксиса подстановочных знаков

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

Вы также можете исключить пакет и все его дочерние/подпакеты следующим образом:

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

Это исключает каждый класс в some.package, а также всех дочерних элементов. Например, some.package.child также не будет включаться в отчеты.

Я тестировал и сообщал о результатах отчета по уменьшенному числу классов, используя приведенное выше.

Если вы затем нажмете этот отчет на Sonar, вам нужно будет сказать Sonar, чтобы исключить эти классы на дисплее, которые можно сделать в настройках Sonar.

Настройки > Общие настройки > Исключения > Покрытие кода

Sonar Docs объясняет это немного больше

Выполнение вашей команды выше

mvn clean verify

Покажет, что классы были исключены

Без исключений

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

С исключениями

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

Надеюсь, что это поможет

Ответ 2

Хотя Андрей уже ответил на вопрос с деталями, я даю код, как исключить его в пом

           <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>

Для приложения Springboot

<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>

Ответ 3

https://github.com/jacoco/jacoco/issues/34

Это разные обозначения для классов:

  • Имя виртуальной машины: java/util/Map $Entry
  • Имя Java: файл записи java.util.Map $
  • Имя: java/util/Map $Entry.class

Параметры агента, задачи Ant и цель подготовки агента Maven

  • включает в себя: имя Java (также имя виртуальной машины)
  • исключает: имя Java (также имя виртуальной машины)
  • exclclassloader: имя Java

Эти спецификации позволяют использовать подстановочные знаки * и?, где * подстановочные знаки любого количества символов, даже нескольких вложенных папок.

Цель отчета Maven

  • включает в себя: Имя файла
  • исключает: имя файла

Эти спецификации позволяют Ant Filespec как подстановочные знаки *, ** и?, где * подстановочные знаки только одного элемента пути.

Ответ 4

Другое решение:

<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>

Обратите внимание, что мы используем "<element>PACKAGE</element>" в конфигурации, которая затем помогает нам исключать на уровне пакета.

Ответ 5

Используйте свойство sonar.coverage.exclusion.

mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.java

Это должно исключить классы из расчета покрытия.

Ответ 6

Вы можете настроить исключение покрытия в свойствах сонара, вне конфигурации плагина jacoco:

...
<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>
....

и не забудьте удалить настройки исключения из плагина

Ответ 7

Вот рабочий пример в файле pom.xml.

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>


        <executions>
            <execution>
                <id>prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>post-unit-test</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>

            </execution>

            <execution>
                <id>default-check</id>
                <goals>
                    <goal>check</goal>
                </goals>

            </execution>
        </executions>
        <configuration>
            <dataFile>target/jacoco.exec</dataFile>
            <!-- Sets the output directory for the code coverage report. -->
            <outputDirectory>target/jacoco-ut</outputDirectory>
            <rules>
                <rule implementation="org.jacoco.maven.RuleConfiguration">
                    <element>PACKAGE</element>
                    <limits>
                        <limit implementation="org.jacoco.report.check.Limit">
                            <counter>COMPLEXITY</counter>
                            <value>COVEREDRATIO</value>
                            <minimum>0.00</minimum>
                        </limit>
                    </limits>
                </rule>
            </rules>
            <excludes>
                <exclude>com/pfj/fleet/dao/model/**/*</exclude>
            </excludes>
            <systemPropertyVariables>

                <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
            </systemPropertyVariables>
        </configuration>
    </plugin>