代码质量度量中代码行数vs指令数及多模块测试覆盖配置咨询
协调JaCoCo与Sonar配置的解决方案
嗨,针对你的8模块项目,咱们可以通过精准的模块级配置来搞定JaCoCo覆盖率统计和Sonar代码质量分析的协调问题,确保数据准确还不冲突。先把你的模块分类理清楚:
- 无需测试覆盖&特殊处理:2个模块(领域对象、自动生成类)
- 能做Sonar分析但没法生成JaCoCo报告:1个GWT模块
- 正常支持JaCoCo+Sonar:5个模块
下面分构建配置(假设你用Maven)和Sonar配置两部分来说明:
一、JaCoCo配置:只在目标模块启用
咱们不用在根pom里全局激活JaCoCo,而是针对性地在需要的模块里启用:
- 先在根pom里定义JaCoCo的通用配置,但默认不激活,这样各个模块可以按需引用:
<build> <pluginManagement> <plugins> <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>report</id> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
- 去那5个正常模块的pom.xml里,显式引入JaCoCo插件,这样它们才会生成覆盖率报告:
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> </plugin> </plugins> </build>
- 那2个无需覆盖的模块和1个GWT模块,千万别加JaCoCo插件,既避免生成无用报告,也不会触发GWT清空target的问题。
二、Sonar配置:精准控制覆盖率统计范围
接下来要让Sonar“知道”哪些模块要统计覆盖率,哪些不用,避免报错或数据不准:
- 排除无需覆盖的模块:告诉Sonar别统计这2个模块的覆盖率,如果它们连代码质量分析都不需要,直接排除整个模块就行:
# 只排除覆盖率统计 sonar.coverage.exclusions=module-domain/**/*,module-generated/**/* # 如果这俩模块完全不需要Sonar分析,直接排除 sonar.exclusions=module-domain/**/*,module-generated/**/*
(注意把module-domain和module-generated换成你实际的模块名称)
跳过GWT模块的覆盖率检查:因为这个模块没法生成JaCoCo报告,咱们得让Sonar别找它的报告,不然会显示0%或者报错。有两种方式:
- 方式一:指定Sonar只读取那5个正常模块的JaCoCo XML报告路径(新版本Sonar推荐用这个参数):
sonar.coverage.jacoco.xmlReportPaths=module-1/target/site/jacoco/jacoco.xml,module-2/target/site/jacoco/jacoco.xml,...- 方式二:针对GWT模块单独禁用覆盖率统计:
# 假设GWT模块叫module-gwt sonar.module-gwt.coverage.exclusions=**/*确保Sonar包含需要分析的模块:你说Sonar要在6个模块运行,也就是除了那2个无需分析的模块,剩下6个(包括GWT)都要做质量分析。如果Sonar默认扫描所有模块,那用上面的
sonar.exclusions排除那2个就行;如果是手动指定模块,记得把6个模块都加到sonar.modules里。
三、GWT模块的临时 workaround(可选)
要是你想试试能不能让GWT模块也生成JaCoCo报告,可以调整报告的生成路径,避开GWT清空的target目录:
在GWT模块的pom里,给JaCoCo指定一个target之外的输出目录,比如项目根目录下的jacoco-reports:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <configuration> <outputDirectory>${project.basedir}/../jacoco-reports/${project.artifactId}</outputDirectory> </configuration> </plugin>
这样就算GWT清空target,报告也能保留,之后Sonar也能读取这个路径的报告。要是这个方法还是不行,就用前面的Sonar配置跳过它的覆盖率统计就好。
四、验证配置是否生效
最后跑两步验证一下:
- 执行
mvn clean test jacoco:report,检查5个正常模块的target/site/jacoco下有没有生成报告,另外3个模块没有报告就对了。 - 运行Sonar扫描命令(比如
mvn sonar:sonar),去SonarQube里看结果:- 那2个无需处理的模块不会出现在分析结果里(或者覆盖率被排除)
- GWT模块能看到代码质量分析数据,但覆盖率显示为未统计(不会显示0%)
- 5个正常模块的覆盖率和质量数据都正确显示
内容的提问来源于stack exchange,提问作者Yassine Badache




