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 구성이 지적한대로 제외되어야했던 클래스를 여전히보고한다는 것입니다. 올바르게 구성하려면 어떻게해야합니까?
답변
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
도움이 되었기를 바랍니다
답변
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>
답변
또 다른 해결책 :
<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>"
패키지 수준에서 제외하는 데 도움이되는 구성에서 사용 하고 있습니다.
답변
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을 허용합니다. 여기서 *는 단일 경로 요소의 일부만 와일드 카드입니다.
답변
sonar.coverage.exclusions 속성을 사용합니다.
mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.java
이것은 커버리지 계산에서 클래스를 제외해야합니다.
답변
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>
....
플러그인에서 제외 설정을 제거하는 것을 잊지 마십시오.
답변
다음은 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>