首页/开发/代码质量与评审速查/PMD:Java 源码规则集
规范与静态检查65 条

PMD:Java 源码规则集

PMD 对 Java 源码做规则化静态分析:规则集如 bestpractices 覆盖未使用字段(UnusedPrivateField)、空 catch(EmptyCatchBlock)、生产代码 System.out 等。

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私有字段声明后从未被使用删除字段,或补上使用它的代码
EmptyCatchBlockcatch 块内没有任何处理记录日志或重新抛出,别静默吞掉
SystemPrintln生产代码里调用控制台输出改用日志框架并设置级别
UselessParentheses无实际作用的括号删掉以提高可读性
AvoidDuplicateLiterals同一字面量重复出现多次提取为常量并统一命名
版本差异:PMD 6 的命令形如 pmd -d 源目录 -R 规则集,PMD 7 改为 pmd check 子命令,对 JDK 版本的要求也更高。升级前先核对官方命令行文档,CI 脚本里的旧写法要同步改掉。
分工建议:Checkstyle 管格式与命名,PMD 管缺陷与坏味道。两者不要配置同一问题的规则,否则一次提交会收到两份重复报告,开发者很快对报告脱敏。
抑制必须留痕:在 @SuppressWarnings 里填 PMD 规则名时要写明原因并在评审中可见,长期无人审计的抑制会把真实缺陷永久隐藏。

易错点

  • 与 Checkstyle 重复配置同一问题:同一次提交报两遍,报告逐渐没人看
  • @SuppressWarnings 抑制滥用且无人审计:真实缺陷被长期隐藏,事后追查不到原因
  • 一次性把全部历史代码纳入规则:几千条存量告警淹没新增问题,应先做基线再管增量
  • 把 PMD 当编译与测试的替代:静态分析只能命中模式化问题,逻辑错误仍需测试覆盖

数据来源与参考

  • PMD 官方文档(docs.pmd-code.org)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌