如何在Sonar覆盖配置中排除包但包含其子包及指定类?
解决Sonar覆盖率排除指定包但包含子包及特定类的问题
刚好我之前处理过类似的Sonar覆盖率配置需求,给你梳理个清晰的解决方案!
你的核心需求是:排除com.myapp.model包下的大部分类,但保留model.mapper子包所有类,以及model包下的ClassToInclude.java。结合Sonar的规则,我们可以通过排除规则+包含规则的组合来实现,而且不需要逐个添加排除类。
正确的配置方案
你之前用<sonar.coverage.exclusions>**/model/*.java</sonar.coverage.exclusions>已经实现了排除model包下直接的类(子包不受影响,因为通配符*.java只匹配当前目录的文件,不递归子目录)。现在只需要再加上包含规则,把特定类明确纳入统计即可:
<properties> <!-- 排除model包下直接的所有Java类(子包类不会被匹配到) --> <sonar.coverage.exclusions>**/model/*.java</sonar.coverage.exclusions> <!-- 明确指定需要包含的类:特定类 + mapper子包所有类 --> <sonar.coverage.inclusions>**/model/ClassToInclude.java, **/model/mapper/**/*.java</sonar.coverage.inclusions> </properties>
配置细节说明
Sonar的规则是包含规则的优先级高于排除规则,所以即使某个文件被匹配到排除规则,只要它同时在包含规则里,就会被纳入覆盖率统计。这里的通配符含义:
**/model/*.java:匹配model包下直接的所有.java文件,不会匹配子包(比如model/mapper/下的文件)**/model/ClassToInclude.java:精准匹配model包下的这个特定类**/model/mapper/**/*.java:匹配model.mapper子包下所有层级的.java文件(包括子子包)
备选方案(不推荐但可行)
如果你不想用包含规则,也可以通过更精准的排除通配符,排除model下除了ClassToInclude.java之外的所有直接类:
<sonar.coverage.exclusions>**/model/*[!ClassToInclude].java</sonar.coverage.exclusions>
不过这种方式依赖文件名的匹配语法,当需要包含多个特定类时,维护起来会很麻烦,所以更推荐第一种“排除+包含”的组合方案。
内容的提问来源于stack exchange,提问作者Alvaro Pedraza
相关产品推荐
相关产品推荐

