如何将target/generated-sources/jaxb目录纳入Jacoco覆盖率报告?
解决Jacoco报告未纳入target/generated-sources/jaxb目录、Sonar无法展示FOSSIL_CLIENT覆盖率的问题
要让Jacoco统计该目录的覆盖率并同步到Sonar,需从Jacoco配置、源码目录识别、Sonar配置三个环节入手,具体操作如下:
一、让Jacoco包含JAXB生成的类
Jacoco默认不会主动统计编译目录外的生成类,需显式配置纳入规则:
Maven项目配置
- 先通过
build-helper-maven-plugin把target/generated-sources/jaxb标记为源码目录,确保编译时处理这些类:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.4.0</version> <executions> <execution> <id>add-jaxb-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>target/generated-sources/jaxb</source> </sources> </configuration> </execution> </executions> </plugin>
- 调整Jacoco插件配置,指定包含该目录下的类:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>generate-report</id> <goals> <goal>report</goal> </goals> <configuration> <includes> <include>**/fossil_client/**/*.class</include> <include>**/target/generated-sources/jaxb/**/*.class</include> </includes> </configuration> </execution> </executions> </plugin>
Gradle项目配置
- 将JAXB生成目录加入源码集:
sourceSets { main { java { srcDirs += 'target/generated-sources/jaxb' } } }
- 配置Jacoco测试报告的包含规则:
jacocoTestReport { includes = [ '**/fossil_client/**/*.class', '**/target/generated-sources/jaxb/**/*.class' ] reports { xml.required = true // Sonar依赖XML格式的报告 } }
二、配置SonarQube识别生成目录
Sonar默认只扫描主源码目录,需手动指定把JAXB生成目录加入源码和二进制文件目录:
Maven项目
在pom.xml的properties中添加:
<properties> <sonar.sources>src/main/java,target/generated-sources/jaxb</sonar.sources> <sonar.java.binaries>target/classes,target/generated-sources/jaxb</sonar.java.binaries> <sonar.jacoco.reportPaths>target/jacoco.exec</sonar.jacoco.reportPaths> </properties>
Gradle项目
在build.gradle的Sonar配置块中添加:
sonarqube { properties { property 'sonar.sources', 'src/main/java,target/generated-sources/jaxb' property 'sonar.java.binaries', 'target/classes,target/generated-sources/jaxb' property 'sonar.jacoco.reportPath', 'build/jacoco/test.exec' } }
三、验证操作
- 重新执行构建+测试+Jacoco报告生成:
- Maven:
mvn clean test jacoco:report,之后查看target/site/jacoco下的HTML报告,确认JAXB目录的类已被统计。 - Gradle:
gradle clean test jacocoTestReport,查看build/reports/jacoco/test/html目录下的报告。
- Maven:
- 执行Sonar扫描:
mvn sonar:sonar(Maven)或gradle sonarqube(Gradle),扫描完成后去Sonar界面检查FOSSIL_CLIENT目录的覆盖率是否正常展示。
注意:如果配置后覆盖率还是0,要确认这些JAXB生成的类确实有对应的测试用例覆盖。另外,确保Jacoco和Sonar插件的版本兼容,避免版本冲突导致配置失效。
内容的提问来源于stack exchange,提问作者Bhuvan Bajaj
相关产品推荐
相关产品推荐

