Maven Jacoco 구성-작동하지 않는 보고서에서 클래스 / 패키지 제외


103

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 verifyjacoco를 실행할 때 내 xml 구성이 지적한대로 제외되어야했던 클래스를 여전히보고한다는 것입니다. 올바르게 구성하려면 어떻게해야합니까?

답변:


181

XML이 약간 잘못되었습니다. excludes 부모 필드 내에 클래스 제외를 추가해야하므로 위의 구성은 Jacoco 문서에 따라 다음과 같아야합니다.

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

제외 필드의 값은 표준 와일드 카드 구문을 사용하여 target / classes / 디렉토리에 상대적인 컴파일 된 클래스의 클래스 경로 (패키지 이름 아님) 여야합니다.

*   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
제외 항목을 고려하려면 Jacoco 플러그인을 버전 0.7.5에서 0.7.6으로 업그레이드해야했습니다.
Stephane

2
Sonar에 관한 훌륭한 팁. JaCoCo 제외가 자동으로 Sonar에 전파 될 것이라고 가정하기 쉽습니다.
markdsievers

10
jacoco 파일 형식을 제외하면 커버리지가 0 % 인 커버리지 보고서에 표시됩니다. 그래서 기본적으로 제외하지 않는 것에 비해 더 나쁜 결과를 얻습니다. 이 문제를 해결할 수 있습니까?
Adam Arold 2016

4
파일 이름 사이에는 점이 아닌 슬래시를 사용해야합니다. 또한 파일 끝은 .java가 아니라 .class입니다.
ThomasRS

1
** 및 *의 영향을 이해하는 것이 중요합니다. **를 포함하지 않으면 기본 디렉터리로 이동하지 않습니다. *는 단일 문자이며 파일 이름 용도로 사용해야합니다.
Smart Coder

18

Andrew가 이미 세부 사항으로 질문에 답변했지만 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>

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>

1
안녕 Vaquar, 나는 jacoco maven 플러그인을 통해 패키지 제외를 위해 머리를 치고 있습니다. 생성 된 Index.html에 Excluded packages를 표시하고 싶지 않습니다. 코드가 있으면 동일한 작업을 수행 할 수 있습니다. 친절하게 도와주세요. imvrajendra@gmail.com에서 나에게 코드를 보내기
Vrajendra 싱 Mandloi에게

3
이 클래스 경로가 있어야한다 보인다 없이 .class종료 : 같은 <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
이것은 나를 위해 보고서에서 전체 패키지를 제거합니다 <exclude>com/mycompany/mypackage/**/*</exclude>
힘든 짐

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>"패키지 수준에서 제외하는 데 도움이되는 구성에서 사용 하고 있습니다.


jacoco-maven-plugin : 0.7.9를 사용하고 있습니다. 솔루션을 사용하면 결과를 올바르게 계산합니다. 그러나 프로젝트의 모든 클래스는 jacoco 보고서 (index.html)에 나타납니다. 커버리지 비율의 실제 가치를 얻기 위해 플러그인이 분석 한 내용을 보고서에 표시 할 수 있습니까?
aloplop85

3

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

다음은 우리가 가지고있는 클래스에 대한 다른 표기법입니다.

  • VM 이름 : java / util / Map $ Entry
  • 자바 이름 : java.util.Map $ Entry 파일
  • 이름 : java / util / Map $ Entry.class

에이전트 매개 변수, Ant 태스크 및 Maven 에이전트 준비 목표

  • 포함 : Java 이름 (VM 이름도 작동 함)
  • 제외 : Java 이름 (VM 이름도 작동 함)
  • exclclassloader : Java 이름

이러한 사양은 와일드 카드 * 및?를 허용합니다. 여기서 * 와일드 카드는 여러 개의 중첩 폴더를 포함하여 여러 문자를 포함합니다.

Maven 보고서 목표

  • 포함 : 파일 이름
  • 제외 : 파일 이름

이러한 사양은 와일드 카드 *, ** 및?와 같은 Ant Filespec을 허용합니다. 여기서 *는 단일 경로 요소의 일부만 와일드 카드입니다.


3

sonar.coverage.exclusions 속성을 사용합니다.

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

이것은 커버리지 계산에서 클래스를 제외해야합니다.


2

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

플러그인에서 제외 설정을 제거하는 것을 잊지 마십시오.


1

다음은 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.