一份小 XML + 一行 sonar 属性,即可把被插件排除的规则重新拉进你的扫描流程。
以下步骤全部在 5 分钟内就能完成,并且不需要改动插件源码、也不需要写 Java 代码。
==================================================
1. 写一份最小化 PMD ruleset XML
==================================================
在任意目录(推荐放到版本库,例如 build/sonar/pmd/ 下面)新建文件 pmd-extra.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="Extra-Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0
https://pmd.github.io/pmd-6.55.0/ruleset_xml_schema.xsd">
<description>Bring back BigDecimalInstantiation that is excluded by default</description>
<!-- ① 直接引用 PMD 官方分类文件 + 规则名 -->
<rule ref="category/java/design.xml/BigDecimalInstantiation">
<!-- ② 若要改参数、严重度,可在这里添加
<priority>2</priority> -- 1=Blocker … 5=Info
<properties>
<property name="violateConstructor" value="true"/>
<property name="violateStaticMethod" value="true"/>
</properties>
-->
</rule>
</ruleset>
说明
• 只引用了一条规则,如需更多就在同个 ruleset 里继续 。
• 文件名和路径完全自由;SonarQube 不要求放到固定目录。
==================================================
2. 告诉 sonar-pmd-plugin 去加载这份文件
==================================================
有三种等价方式,任选其一即可——
❶ 在项目级别(最常见)
把路径写进 sonar-project.properties 或 pom.xml/gradle.properties 里:
# 如果文件和 sonar-project.properties 在同一目录,可用相对路径
sonar.pmd.ruleSets=build/sonar/pmd/pmd-extra.xml
❷ 在 CLI 临时指定(适合偶尔试验)
sonar-scanner \
-Dsonar.projectKey=my-app \
-Dsonar.pmd.ruleSets=build/sonar/pmd/pmd-extra.xml
❸ 在服务器全局生效
Administration ▶ General Settings ▶ PMD ▶ RuleSets
填绝对路径或 file:// URL,例如
/opt/sonar/rules/pmd-extra.xml
对所有项目都有效;路径必须对 SonarQube Server 进程可见。
注意
• 可以同时列多个 XML,用逗号分隔:
sonar.pmd.ruleSets=r1.xml,r2.xml
• 如果设置了项目级属性,会覆盖(而不是追加)全局设置。
==================================================
3. 重新执行一次扫描
==================================================
执行 Sonar Scanner(Maven sonar:sonar、Gradle sonar、独立 CLI 皆可)。
在扫描日志里能看到类似行,说明自定义 ruleset 已被加载:
INFO PMD: Loading ruleset from file: /path/to/pmd-extra.xml
扫描完后,进入 Issues 或 Pull Request 即可看到:
• new BigDecimal(…double/float…)
• BigDecimal.valueOf(double/float)
都会被标记为 Major (Code Smell)。
==================================================
4. 常见疑问
==================================================
Q1. 路径是给 Server 还是给 Scanner?
答:sonar.pmd.ruleSets
由 Scanner 读取并发送给 Sever,所以路径要对 Scanner 进程可见(通常就是你运行构建的那台机器)。Server 不会再去访问文件。
Q2. 可以把规则改成 Blocker 级吗?
答:可以。在 里加 1 即可(1=Blocker,2=Critical…)。
Q3. 这条规则跟 SonarJava S2111 重复吗?
答:S2111 只检查构造函数;BigDecimalInstantiation 同时检查 valueOf
。两者重叠部分(constructor)可能报告 2 条 issue,可在 Quality Profile 里把 S2111 禁掉,或通过 “Merge Duplicates” 功能合并。
就这么简单:一份小 XML + 一行 sonar 属性,即可把被插件排除的规则重新拉进你的扫描流程。