
简介这份资源是面向Java开发者与代码质量管理人员的PMD规则配置文件集合用于在Eclipse等开发环境中落地静态代码检查帮助团队发现潜在缺陷、不良编码习惯与可读性问题适合希望建立或定制代码规范的中初级开发者参考。压缩包共10个文件以9个XML规则配置文件和1份说明文档为主XML按设计、冗余代码、复杂度、空代码块、导入、未使用代码等类别拆分组织便于按需导入或组合使用整体约35KB体积轻量、结构清晰。目前已有1059人学习下载。读者可从中获得可直接导入PMD插件的规则集理解规则集、规则、类别、参数与排除项等XML标签的组织方式并据此调整阈值、增删规则形成贴合项目需求的检查方案也可作为持续集成中统一代码质量标准的配置基础。1. PMD 规则文件怎么装从一次规则集加载失败说起第一次在 CI 里接 PMD 静态检查我图省事只把pmd-bin解压到构建机跑起来才发现规则文件根本没生效——报告里一条违规都没有看着像“代码质量全优”实际是规则集压根没加载上。PMD 的规则文件ruleset XML不是装完二进制就自动就位的它需要你显式指定路径、声明规则引用、处理版本差异任何一环对不上检查就会静默降级。这套环境在 Java 项目里太常见了装不好最典型的后果不是报错而是“假通过”CI 绿灯问题代码照样合进去。这篇笔记面向正在配 PMD 规则文件的开发者从版本选择、目录布局、规则集编写到验证排错按我实际踩过的顺序走一遍新手能照着跑通熟手能对一下版本和参数取舍。2. 装前把版本和目录定死PMD 6 与 7 的规则文件差异PMD 的规则文件本身是 XML但不同大版本对规则集结构、规则引用方式、内置规则名的要求差别不小。装之前先把版本和目录定死能省掉后面一半的玄学问题。我一般不在项目里直接解压二进制而是固定一个工具目录把 PMD 版本和规则文件分开管理升级时只换二进制、规则文件走版本控制。2.1 选版本先看 JDK再看规则集写法PMD 6.x 和 7.x 对 JDK 的要求不同规则集里引用规则的方式也有变化。常见做法是先确认构建机 JDK再反推 PMD 版本而不是先下最新版。PMD 版本建议 JDK规则集特点适用场景6.55.xJDK 8 及以上规则引用多为ruleset.xml内rule refcategory/java/...老项目、JDK 8 构建链7.xJDK 11 及以上规则名与分类有调整部分规则被移除或重命名新项目、JDK 11 构建链我一般会先跑一句确认环境java -version # 输出主版本号决定后面下 6.x 还是 7.x逻辑说明PMD 7 要求 JDK 11 起步如果构建机还是 JDK 8硬上 7.x 会在启动阶段就报UnsupportedClassVersionError而不是规则文件报错容易误判成规则写错。参数上没什么可调的就是看java -version的主版本号8 走 6.55.x11 及以上再考虑 7.x。2.2 目录布局二进制、规则文件、报告分三处放规则文件最容易翻车的地方是路径。相对路径在本地跑得好好的到 CI 里工作目录一变就找不到。我习惯把三样东西分开# 工具目录只放解压后的 PMD 二进制 /opt/pmd/pmd-bin-6.55.0/ # 规则目录跟着项目走进版本控制 project/config/pmd/ruleset.xml # 报告目录构建产物不进版本控制 project/build/reports/pmd/逻辑说明二进制放系统目录升级时整目录替换规则文件放项目内评审和回滚都方便报告目录单独隔离避免规则文件和产物混在一起被误提交。参数上规则文件路径在命令里一律用绝对路径或基于项目根的显式路径不依赖当前工作目录。提示规则文件里如果引用了自定义规则类类文件路径也要一起固定否则规则集能解析、执行时却找不到实现类。2.3 解压与权限别让执行位丢掉下载 PMD 二进制压缩包后解压常见坑是解压工具丢了执行位pmd脚本跑不起来。unzip pmd-bin-6.55.0.zip -d /opt/pmd/ chmod x /opt/pmd/pmd-bin-6.55.0/bin/run.sh # 验证入口脚本可执行 /opt/pmd/pmd-bin-6.55.0/bin/run.sh --version逻辑说明chmod x补执行位--version是最轻量的自检能打印版本说明二进制和 JVM 都正常。如果这一步就报Permission denied先查解压方式再查挂载的文件系统是否带noexec。3. 写规则集文件从最小可用到按需裁剪规则文件不是越长越好最小可用规则集先跑通再按团队规范往里加。PMD 的规则集本质是一个 XML根节点ruleset里面用rule引用内置规则或定义自定义规则。写的时候最容易错的是规则引用路径和规则名版本一换就对不上。3.1 最小规则集先引一个分类确认能加载先写一个只引一个分类的最小规则集确认整条链路通再往上加。?xml version1.0 encodingUTF-8? ruleset nameproject-basic xmlnshttp://pmd.sourceforge.net/ruleset/2.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.net/ruleset_2_0_0.xsd description项目基础规则集先只引最佳实践分类/description !-- 引用内置分类路径相对 PMD 内置规则库 -- rule refcategory/java/bestpractices.xml/ /ruleset逻辑说明ruleset的name是规则集标识报告里会显示rule ref指向 PMD 内置规则分类文件路径是相对内置规则库的不是相对你的项目目录。参数上xsi:schemaLocation建议保留编辑器能做结构校验写错标签能提前发现。这个最小集跑通说明规则文件路径、XML 结构、PMD 版本三者对上了。3.2 按需裁剪排除规则与调整优先级全量引一个分类往往噪音太大常见做法是在引用后排除个别规则或把优先级调低。rule refcategory/java/bestpractices.xml !-- 排除与现有代码风格冲突的规则 -- exclude nameUnusedPrivateField/ !-- 把某条规则优先级调低先观察不阻断 -- rule refUnusedLocalVariable priority3/priority /rule /rule逻辑说明exclude按规则名排除规则名要和 PMD 内置规则名完全一致拼错不会报错、只是不生效这是最隐蔽的坑之一priority数值越小优先级越高调低后报告里仍会出现但可以配合阈值决定是否阻断构建。参数取舍上我一般先全量跑一遍看报告再按违规密度决定排除还是调优先级不凭感觉提前裁。3.3 自定义规则引用类路径和规则名都要对团队有自己的规则实现时规则集里要引自定义规则类这里类路径写错是最常见的失败点。rule nameCustomNamingRule languagejava message命名不符合团队规范 classcom.example.pmd.CustomNamingRule description团队自定义命名检查/description priority2/priority /rule逻辑说明class是自定义规则实现类的全限定名必须和编译产物里的包路径一致language要和规则实现支持的语言匹配。执行时这个类要能被 PMD 的类加载器找到常见做法是把自定义规则打成 jar 放进 PMD 的lib目录或在命令里用-auxclasspath补类路径。类找不到时 PMD 会报规则初始化失败而不是静默跳过这一点比内置规则名拼错要好排查。4. 跑起来并接进构建命令行参数与 CI 配置规则文件写好后先用命令行跑通再接进构建脚本。命令行阶段把参数调顺CI 里基本就是复制参数、换路径。4.1 命令行最小调用指定规则集和源目录/opt/pmd/pmd-bin-6.55.0/bin/run.sh pmd \ -d src/main/java \ -R config/pmd/ruleset.xml \ -f text \ -r build/reports/pmd/report.txt逻辑说明-d指定待检查源码目录-R指定规则集文件这里用相对项目根的路径执行前先cd到项目根-f是报告格式text适合先看结果接 CI 时换成xml或sarif-r是报告输出路径目录要先存在。参数取舍上先别加-failOnViolation等规则集稳定后再加否则第一次跑就阻断构建容易把规则配置和代码问题混在一起排查。4.2 接进构建脚本固定工作目录和退出码CI 里最常见的问题是工作目录和本地不一致规则文件相对路径失效。我一般在脚本里先显式切目录再跑 PMD。#!/usr/bin/env bash set -euo pipefail # 显式切到项目根避免 CI 工作目录差异 cd $(dirname $0)/.. PMD_HOME/opt/pmd/pmd-bin-6.55.0 RULESETconfig/pmd/ruleset.xml REPORT_DIRbuild/reports/pmd mkdir -p $REPORT_DIR $PMD_HOME/bin/run.sh pmd \ -d src/main/java \ -R $RULESET \ -f xml \ -r $REPORT_DIR/pmd.xml \ -failOnViolation true逻辑说明set -euo pipefail让脚本在任一步失败时退出避免 PMD 失败但构建继续cd $(dirname $0)/..把工作目录固定到项目根规则文件相对路径才稳定-failOnViolation true在有违规时返回非零退出码构建才会红。参数上-failOnViolation的值是布尔写true或false别写成1不同版本解析行为不完全一致。4.3 报告格式选择text、xml、sarif 怎么选格式参数适用场景注意点text-f text本地快速看结果不适合机器解析xml-f xmlCI 归档、二次处理结构稳定字段随版本略有差异sarif-f sarif接代码扫描平台需要 PMD 版本支持该格式我一般本地用text看前几条违规CI 用xml归档需要对接扫描平台再换sarif。格式本身不影响规则是否生效但格式选错会让“报告为空”和“规则没加载”看起来一样排查时先确认格式参数拼写。5. 避坑与排查规则文件不生效的五种典型现象规则文件相关的问题大多表现为“没报错但结果不对”。下面五条是我实际遇到过的按现象、原因、解决记下来。5.1 报告为空但代码明显有问题现象PMD 跑完退出码 0报告里零违规。原因规则集路径写错或规则引用路径不对PMD 加载了一个空规则集不报错。解决先用-R指向最小规则集跑一遍确认有违规输出再检查rule ref路径是否相对内置规则库而不是相对项目目录。5.2 报规则名找不到现象启动时报Cannot find rule或规则初始化失败。原因规则名拼错或 PMD 版本升级后规则被重命名、移除。解决对照当前版本的内置规则清单核对规则名升级大版本时逐条过一遍规则集别直接复用旧文件。5.3 自定义规则类加载失败现象报ClassNotFoundException或规则初始化异常。原因自定义规则 jar 没放进 PMD 类路径或class全限定名和实际包路径不一致。解决把 jar 放进 PMDlib目录或用-auxclasspath显式补路径再核对类名。5.4 本地通过、CI 失败现象同一份规则文件本地跑正常CI 报找不到规则集。原因CI 工作目录和本地不同相对路径失效。解决脚本里显式cd到项目根规则文件路径基于项目根写不用当前目录相对路径。5.5 排除规则不生效现象写了exclude对应规则仍然报违规。原因exclude的name和实际规则名不完全一致拼错不报错。解决从报告里复制规则名别手敲排除后跑一次确认该规则不再出现。6. 装完怎么验证三步确认规则文件真的在跑规则文件配完最怕的是“看起来跑了”。我验证分三步每步都有明确的通过标准不靠感觉。6.1 第一步最小规则集能产出违规先拿一段故意写得不规范的代码用最小规则集跑确认报告里有对应违规。通过标准是违规条数大于零且规则名和预期一致。这一步排除“规则集空加载”。# 临时目录放一段测试代码 mkdir -p /tmp/pmd-check/src cat /tmp/pmd-check/src/Bad.java EOF public class Bad { private int unused; public void m() { int x 1; } } EOF /opt/pmd/pmd-bin-6.55.0/bin/run.sh pmd \ -d /tmp/pmd-check/src \ -R config/pmd/ruleset.xml \ -f text逻辑说明测试代码里放了未使用字段和未使用局部变量最小规则集若引了最佳实践分类应能报出对应违规。如果输出为空回到 5.1 排查规则集加载。6.2 第二步排除和优先级按预期生效在最小规则集基础上加一条exclude再跑同一段代码确认对应规则不再出现再加一条调低优先级的规则确认报告里仍出现但优先级字段变化。通过标准是“排除的消失、调低的还在”说明规则集裁剪逻辑真的被解析了。6.3 第三步CI 退出码符合预期最后在 CI 脚本里跑一次带-failOnViolation true的调用故意留一条违规确认构建变红清掉违规再跑确认构建变绿。通过标准是退出码随违规有无变化。这一步排除“报告生成了但没阻断”的假通过。验证步骤通过标准失败时先查最小规则集有违规输出规则集路径、rule ref路径裁剪生效排除消失、调低仍在exclude规则名拼写CI 退出码有违规红、无违规绿-failOnViolation参数值从那以后我每次改规则文件都强制走一遍这三步尤其是第一步的最小规则集宁可多跑一次也不让空规则集混进 CI。规则文件这东西出错时往往不吭声验证做扎实比事后翻报告省事得多。希望帮到你。本文还有配套的精品资源点击获取