PMD 是什么
PMD 是源码级静态分析工具,解析源代码语法树但不执行代码,用来查缺陷与坏味道,最初面向 Java,现在也支持 Apex、Visualforce 等语言。检查项按规则集组织:category/java/bestpractices.xml 覆盖未使用的私有字段、空的 catch 块、生产代码里的控制台输出;category/java/codesize.xml 关注超大方法与过长参数列表。它与偏格式规范的 Checkstyle 互补,而不是替代关系。
基本信息
| 适用平台 | JDK 环境,命令行 / Maven / Gradle 插件 |
|---|---|
| 规则集 | category/java/bestpractices.xml、errorprone.xml、codesize.xml 等 |
| 自定义规则 | 用 pmd-ruleset.xml 引用或改写官方规则 |
| 权限要求 | 普通用户,能读取源码目录即可 |
| 门禁方式 | --failOnViolation 或 CI 报告阈值 |
典型使用场景
- 提交前扫一遍未使用字段、空 catch 这类可立即修改的问题
- CI 中对本次变更的文件做增量扫描,不阻塞存量代码
- 用 codesize 规则给超大方法、过长参数列表做告警
- 把团队约定写成自定义规则集,替代口头评审意见
- 多语言项目中复用同一套扫描流程与报告格式
命令行用法
命令行用法
pmd check -d src/main/java -R category/java/bestpractices.xml -f text # 扫描目录并输出文本
pmd check -d src -R category/java/codesize.xml -f html -r report.html # 输出 HTML 报告
pmd check -d src -R pmd-ruleset.xml --cache pmd.cache # 用自定义规则集并启用缓存
pmd check -d src -R category/java/errorprone.xml --no-progress # 关闭进度输出便于 CI 记录常见规则读法
| 规则 | 检查内容 | 处理 |
|---|---|---|
| UnusedPrivateField | 私有字段声明后从未被使用 | 删除字段,或补上使用它的代码 |
| EmptyCatchBlock | catch 块内没有任何处理 | 记录日志或重新抛出,别静默吞掉 |
| SystemPrintln | 生产代码里调用控制台输出 | 改用日志框架并设置级别 |
| UselessParentheses | 无实际作用的括号 | 删掉以提高可读性 |
| AvoidDuplicateLiterals | 同一字面量重复出现多次 | 提取为常量并统一命名 |
版本差异:PMD 6 的命令形如 pmd -d 源目录 -R 规则集,PMD 7 改为 pmd check 子命令,对 JDK 版本的要求也更高。升级前先核对官方命令行文档,CI 脚本里的旧写法要同步改掉。
分工建议:Checkstyle 管格式与命名,PMD 管缺陷与坏味道。两者不要配置同一问题的规则,否则一次提交会收到两份重复报告,开发者很快对报告脱敏。
抑制必须留痕:在 @SuppressWarnings 里填 PMD 规则名时要写明原因并在评审中可见,长期无人审计的抑制会把真实缺陷永久隐藏。