升级Java 8到11后SonarQube代码覆盖率变为0问题求助
解决Java 11 + Jacoco 0.8.7下Sonar代码覆盖率为0的问题
以下是针对该问题的具体排查和修复步骤:
1. 确认Jacoco与Maven生命周期的执行顺序
确保Jacoco的prepare-agent目标在test阶段前执行,report目标在test阶段后完成。正确的插件执行配置示例:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <executions> <!-- 预准备代理,在测试前生成exec数据文件 --> <execution> <id>jacoco-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${project.build.directory}/jacoco.exec</destFile> </configuration> </execution> <!-- 生成Jacoco报告,绑定到test阶段之后 --> <execution> <id>jacoco-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/jacoco.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory> </configuration> </execution> </executions> </plugin>
2. 检查Sonar与Jacoco报告的关联配置
SonarQube新版本推荐使用sonar.coverage.jacoco.xmlReportPaths参数指定Jacoco的XML报告路径,替代旧的sonar.jacoco.reportPaths:
- 命令行方式:执行Sonar扫描时添加参数:
mvn clean test jacoco:report sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
- Pom配置方式:在Sonar Maven插件中直接指定路径:
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.9.1.2184</version> <!-- 适配Java 11的稳定版本 --> <configuration> <sonar.coverage.jacoco.xmlReportPaths>${project.reporting.outputDirectory}/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths> </configuration> </plugin>
3. 验证Jacoco报告是否正常生成
手动执行mvn clean test jacoco:report,查看target/site/jacoco目录下是否存在jacoco.xml、index.html等报告文件。如果未生成,需排查:
- 测试用例是否正常执行:查看
target/surefire-reports下的测试报告,确认测试没有全部失败或跳过; - 解决VM参数冲突:如果测试阶段的
argLine覆盖了Jacoco的代理参数,需合并参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <!-- 适配Java 11的版本 --> <configuration> <argLine>${argLine} --add-opens java.base/java.lang=ALL-UNNAMED</argLine> <!-- 保留Jacoco的${argLine}变量,添加Java 11所需参数 --> </configuration> </plugin>
4. 检查Java 11兼容性配置
若项目使用Java模块系统(存在ModuleInfo.java),需为Jacoco代理添加模块访问权限:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <configuration> <argLine>--add-opens 你的模块名/你的包路径=org.jacoco.agent</argLine> </configuration> <!-- 执行配置同上 --> </plugin>
5. 确认版本一致性
确保pluginManagement中声明的Jacoco版本与build/plugins中实际使用的版本完全一致,避免版本冲突导致的异常。
内容的提问来源于stack exchange,提问作者Oragon
相关产品推荐
相关产品推荐

