PMD 7.x 版本演进全览:从 7.0.0 大重构到 7.28 的规则、语言与工程能力盘点
静态分析代码质量【免费下载链接】pmdAn extensible multilanguage static code analyzer.项目地址https://gitcode.com/gh_mirrors/pm/pmd点击查看免费下载PMD 是业界广泛使用的可扩展多语言静态代码分析器其 7.x 系列从 2023 年的首个 RC 一路演进到 2026 年的 7.28.0完整经历了「大版本重构 → 逐版本打磨」的整个过程。本文以仓库内的 历史发布说明 为骨架系统梳理 PMD 7.x 的版本时间线、7.0.0 的架构级变革、Java 语言版本支持策略、规则体系演进、Kotlin 类型感知分析、CPD 能力扩展以及安全与发布工程实践帮助读者快速建立对 PMD 7 全貌的认知并为升级、选型与自定义规则开发提供依据。PMD 7 新 CLI 演示动画一、PMD 7.x 版本时间线总览7.x 系列采用固定节奏的 minor release 模式通常每 2735 天一个版本每个版本以「新特性New and noteworthy→ 规则变更 → 修复 → API 变更 → 合并的 PR → 依赖升级 → 统计」的标准结构发布。从发布说明统计看各版本发布节奏稳定例如 7.0.0 距上一大版本6.55.0相隔 390 天而此后的小版本间隔大多在一个月以内。版本发布日期核心主题7.0.02024-03-22大版本重构Java 21/22、Kotlin/Swift、Apex 新解析器、CPD 新语言、统一 CLI、XPath 3.17.1.02024-04-26更稳健的 CPD 报告UnnecessaryVarargsArrayCreation等新规则7.2.02024-05-31集合以 XPath 序列属性形式暴露7.3.02024-06-28移除 pmd-compat6CPD XML 报告 schema 化新增退出码 57.4.02024-07-26AvoidNonRestrictiveQueriesApex 性能7.5.02024-08-30Java 23 支持AvoidSynchronizedStatement7.6.02024-09-27Git 默认分支切换为 main7.7.02024-10-25C CPD 支持忽略字面量与标识符JUnit/switch 规则批量重命名7.8.02024-11-29QueueableWithoutFinalizerApex7.9.02024-12-27CPD 支持 Rust7.10.02025-01-31Java 24 支持ExhaustiveSwitchHasDefault更换 GPG 签名密钥7.11.02025-02-28AvoidStatefulDatabaseResult发布二进制签名7.12.02025-03-28ImplicitFunctionalInterface7.13.02025-04-25官方 Docker 镜像语言方言Dialect实验性支持7.14.02025-05-30CLI 默认多线程-t 1CUnnecessaryWarningSuppression7.15.02025-06-27AvoidBooleanMethodParametersApex7.16.02025-07-25Java 25 支持CPD 支持 CSSReplaceJavaUtilCalendar/Date7.17.02025-09-12命名规范、ModifierOrder、CollectionTypeMismatch等 9 个 Java 新规则CPD Markdown 报告7.18.02025-10-31构建要求提升至 Java 17IdenticalConditionalBranches等新规则7.19.02025-11-28EnumComparison、AvoidFutureAnnotationApex/PLSQLNcssCount合并7.20.02025-12-30OnlyOneReturn新增ignoredMethodNames7.21.02026-01-30Java 26 支持构建要求提升至 Java 21枚举属性值统一为小驼峰7.22.02026-02-27修复 VBHTML/YAHTML 报告存储型 XSSUnnecessaryInterfaceDeclaration7.23.02026-03-27修复类版本7.24.02026-04-24AvoidInterfaceAsMapKey、OverridingThreadRun7.25.02026-05-29ANTLR 升级至 4.13.2违规报告位置精确化单行警告7.26.02026-06-29Swift 语法错误按处理错误上报WrongTestAnnotation、AssertEqualsArgumentOrder7.27.02026-08-28Java 27 支持Apex 67.0Kotlin 类型感知分析auxClasspath7.28.02026-09-25Kotlin XPath 函数与类型属性OnDemandImport、InternalApiUsage等 6 个新规则二、7.0.0一次架构级的全面重构7.0.0 是自 PMD 6 之后近 390 天的首个大版本官方明确声明「它不是 PMD 6.55.0 的直接替代品」并配套发布了 迁移指南。其变革可以归纳为五个层面。2.1 Java 模块彻底重写语法更贴近 JLSJava 语法被大幅重构与 Java 语言规范JLS的一致性显著提升所有内置规则都针对新 AST 做了适配类型解析与符号表重写类型解析框架与符号表按 JLS 重新实现AST 暴露了更多语义信息方法调用、字段访问报告位置收窄此前方法或类级别的违规会报告整个方法/类的行区间7.0.0 起只报告方法名或类名标识符所在行这一行为由各节点对Node#getReportLocation()的重写控制并影响CognitiveComplexity等多个规则。2.2 语言版图扩张Java 21/22标准特性支持 JEP 456Unnamed Variables Patterns、JEP 440Record Patterns、JEP 441Pattern Matching for switch预览特性通过PMD_JAVA_OPTS--enable-preview配合--use-version java-22-preview启用Kotlin稳定支持 Kotlin 1.8 语法首批内置 2 条规则FunctionNameTooShort、OverrideBothEqualsAndHashcode在 pmd-kotlin 模块中实现Swift新增有限支持 Swift 5.9宏展开首批 4 条内置规则ForceCast、ForceTry、ProhibitedInterfaceBuilder、UnavailableFunctionApex 换芯将闭源的 Jorje 解析器替换为完全开源的 apex-parserANTLR 语法 Google Summit-ASTANTLR 解析树转 AST组合可解析 User Mode Database Operations 与??空值合并运算符Apex 支持推进到 60.0Spring 24CPD 新增语言Coco、Julia、TypeScript、Apache VelocityVTL并改进 C--ignore-sequences、Groovy支持 Groovy 3/4 与CPD-ON/CPD-OFF抑制与 JavaScriptES6、注释保留。2.3 统一 CLI7.0.0 将原来分散的工具整合为单一脚本pmdWindows 下pmd.bat通过子命令区分功能pmd check # 运行 PMD 规则分析项目 pmd cpd # 运行 CPD复制粘贴检测器 pmd designer # 运行 PMD Rule Designer同时为pmd check增加了进度条与 shell 补全支持。完整的参数说明可参考 CLI 参考文档。2.4 XPath 3.1 与规则编写体系XPath 规则引擎从 XPath 1.0 升级到 3.1基于 Saxon移除 Jaxen所有规则的violationSuppressXPath属性默认按 XPath 3.1 求值配套提供了 Node Stream API、Metrics 框架、测试框架、语言生命周期Language Lifecycle与语言属性Language Properties等新能力。2.5 API 清理与兼容层旧的属性类IntProperty、StringProperty等被移除统一改用PropertyFactory多值属性分隔符从|改为逗号,可用反斜杠转义数值属性的min/max变为可选提供新的程序化 CPD 入口 CpdAnalysis对应 pmd-core 中的net.sourceforge.pmd.cpd包为 maven-pmd-plugin 提供pmd-compat6兼容模块后续在 7.3.0 中正式移除大量历史废弃规则与规则集rulesets/java/basic.xml等 PMD 5 时代遗留被清理。三、Java 语言版本支持21 → 27 的演进路线PMD 7 对 Java 的支持采用「标准特性 预览特性」双轨机制标准特性直接由对应语言版本如java-21解析预览特性则需要两步操作设置环境变量PMD_JAVA_OPTS--enable-preview并选择NN-preview版本。export PMD_JAVA_OPTS--enable-preview pmd check --use-version java-25-preview ...各版本演进要点7.0.0Java 21/22Record Patterns、Pattern Matching for switch、Unnamed Variables Patterns 正式支持7.5.0Java 23四个预览特性JEP 455/476/477/482注意 String Templates 预览特性自 Java 23 起不再存在7.10.0Java 24四个预览特性JEP 488/492/494/495同年 7.10.0 移除了为 String Templates 引入的实验性 AST 节点ASTTemplate等7.16.0Java 25JEP 511/512/513 三个新标准特性 JEP 507 预览ASTImportDeclaration#isModuleImport、ASTImplicitClassDeclaration等 API 转正为稳定7.21.0Java 26JEP 530 预览同版本构建要求提升到 Java 21PMD 运行时仍保持 Java 8 兼容7.27.0Java 27JEP 532 预览java-27-preview版本可选。每个新大版本都会移除更早的 preview 版本例如 7.16.0 移除java-23-preview7.21.0 移除java-24-preview7.27.0 移除java-25-preview使用方需跟随升级。四、规则体系的持续演进4.1 新规则按语言与类别持续扩充7.x 每个 minor release 几乎都会带来新规则主要集中在 Java其次是 Apex、Kotlin、Swift、PL/SQL 与 XML。按时间归纳的亮点规则包括Best PracticesUnnecessaryVarargsArrayCreation7.1、UseEnumCollections7.3报告以枚举为键的HashMap/HashSet建议改用枚举专用集合、UnusedLocalVariable大幅增强、ExhaustiveSwitchHasDefault7.10、ImplicitFunctionalInterface7.12、RelianceOnDefaultCharset/VariableCanBeInlined/CollectionTypeMismatch7.17、LabeledStatement/UnusedLabel7.18、EnumComparison7.19、OnDemandImport/TypeNameMismatch7.28CodestyleUseExplicitTypes7.0报告var用法、UnnecessaryBoxing7.0、LambdaCanBeMethodReference7.1、ModifierOrder/TypeParameterNamingConventions7.17后者取代GenericsNaming、UnnecessaryBlock7.25Error ProneConfusingArgumentToVarargsMethod7.1、UselessPureMethodCall7.17、IdenticalConditionalBranches7.18、UnsupportedJdkApiUsage7.21覆盖sun.*与sun.misc.Unsafe等非便携 API取代DontImportSun、WrongTestAnnotation/AssertEqualsArgumentOrder7.26、UnusedReturnValue7.27、LongLiteralEndingWithLowercaseL/InternalApiUsage7.28DesignProtectedMemberInFinalClass7.27取代AvoidProtectedFieldInFinalClass与AvoidProtectedMethodInFinalClassNotExtending、PublicMemberInNonPublicType7.21ApexAvoidNonRestrictiveQueries7.4、AvoidStatefulDatabaseResult7.11、TypeShadowsBuiltInNamespace7.13、AvoidFutureAnnotation7.19、InvocableClassNoArgConstructor7.26、ApexUnitTestClassShouldHaveRunRelevantTestsAnnotation7.28针对 SalesforceRunRelevantTests部署场景标注为 Beta、要求 API 66.0。4.2 规则重命名更准确的命名与旧名兼容7.x 进行了两轮大规模规则重命名旧名仍然可用但被标记为 deprecated7.7.0一批以 JUnit 命名的规则改为UnitTest*前缀以反映其同时适用于 JUnit 5/TestNG 的真实范围如JUnitTestsShouldIncludeAssert→UnitTestShouldIncludeAssert一批 switch 相关规则改为同时覆盖语句与表达式如SwitchStmtsShouldHaveDefault→NonExhaustiveSwitch、DefaultLabelNotLastInSwitchStmt→DefaultLabelNotLastInSwitch、TooFewBranchesForASwitchStatement→TooFewBranchesForSwitch7.17.0GenericsNaming→TypeParameterNamingConventions、UnnecessaryLocalBeforeReturn→VariableCanBeInlined、AvoidLosingExceptionInformation/UselessOperationOnImmutable→UselessPureMethodCall7.27.0UseUtilityClass→InstantiableUtilityClass。4.3 关键规则属性的调整示例NonThreadSafeSingleton7.28checkNonStaticMethods属性被废弃且不再生效规则现在同时报告静态与非静态方法此前默认只报告静态方法可能导致违规增多。若需恢复抑制非静态方法可配置 XPath 抑制属性property nameviolationSuppressXPath value.[ancestor-or-self::MethodDeclaration[1][Static false()]] /VariableCanBeInlined7.28statementOrderMatters属性被废弃计划在 PMD 8.0.0 移除AvoidCatchingGenericException7.18新增typesThatShouldNotBeCaught属性并整体从 Design 类别迁移至 Error Prone 类别同时取代并废弃AvoidCatchingNPE与AvoidCatchingThrowable。从「Design」类别批量引入规则的自定义规则集需要显式补充引用rule refcategory/java/errorprone.xml/AvoidCatchingGenericException /OnlyOneReturn7.20/7.25新增ignoredMethodNames默认compareTo、equals与allowGuardIfs属性枚举属性值统一7.21AvoidUsingHardCodedIP的checkAddressTypes、ConfusingTernary的nullCheckBranch、ModifierOrder的typeAnnotations、CommentRequired的各属性值全部改为小驼峰形式如ipv4、any、onType、required旧值仍可用但会触发废弃警告。4.4 违规报告位置的精确化单行警告从 7.25.0 起PMD 持续收敛违规报告位置目标是从「整类/整块」缩小到「仅相关标识符行」。7.25.0 一次更新了 34 个 Java 规则包括CyclomaticComplexity、TooManyFields、TooManyMethods、ExcessiveImports、ExcessivePublicCount等例如CouplingBetweenObjects只报告类标识符、ExhaustiveSwitchHasDefault只报告 switch 关键字、TooManyStaticImports只报告第一个静态导入。这会影响 CI 脚本中的行号断言升级时需注意。五、Kotlin从实验语言到类型感知分析Kotlin 在 7.0.0 以实验特性引入、随即转正此后一路获得重点投入7.25.0 为 Kotlin 引入实验性的 AttributeView 自定义属性机制与PARSE_TIMEOUT_SECONDS语言属性7.26.0 新增LocalVariableShadowsParameter规则7.27.0 为 Kotlin 加入基于auxClasspath语言属性的类型感知分析type-aware analysis7.28.0 将类型信息接入 XPath 规则层。5.1 类型属性7.28依赖类型解析以下属性暴露在声明节点property、function、class、parameter、catch、for-loop、委托说明符、注解节点上仅在配置auxClasspath且 kotlin-type-mapper 完成类型解析后才可用TypeName、ReturnTypeName、AnnotationFqNames注解全限定名底层实现位于 KotlinNodeTypeData 及配套的 KotlinTypeName 与 InternalApiBridge并有 KotlinAuxClasspathIntegrationTest 等测试覆盖。7.28.0 将getTypeName/getReturnTypeName重命名为getType/getReturnType返回类型从String改为KotlinTypeName实验性 API 的破坏性变更。5.2 通用属性7.28不依赖类型解析Mutable、Identifier、Name暴露在声明与 import 相关节点上无论是否配置auxClasspath都始终可用。5.3 XPath 函数7.28pmd-kotlin 命名空间下新增 7 个 XPath 函数函数语义pmd-kotlin:typeIs(typeName)节点类型为typeName或其子类型时匹配pmd-kotlin:typeIsExactly(typeName)仅精确匹配声明的类型不含子类型pmd-kotlin:hasAnnotation(name)节点含指定简单名或全限定名注解时匹配pmd-kotlin:modifiers()以序列返回声明的修饰符关键字pmd-kotlin:isNullable()声明类型可空带?时返回truepmd-kotlin:hasUnresolvedReference()节点含未解析引用时返回truepmd-kotlin:matchesSig(signature)按方法签名模式支持通配符匹配调用点同时新增的 AST 属性视图类如KtPropertyDeclarationAttributes、KtFunctionValueParameterAttributes、KtCatchBlockAttributes等均在net.sourceforge.pmd.lang.kotlin.ast包中Java 规则可通过KotlinInnerNode#attributes访问并自动暴露给 XPath。六、CPD复制粘贴检测的持续增强CPD 在 7.x 中同样持续进化新语言支持TypeScript、Julia、Coco、VTL7.0、Rust7.9、CSS7.16随pmd-css模块发布报告格式7.3.0 起 CPD 的 XML 报告基于 XSD schemacpd-report_1_0_0.xsd根元素pmd-cpd增加pmdVersion、timestamp、version属性并将可恢复错误作为error元素写入旧格式可通过 rendererxmlold使用已废弃7.17.0 新增 Markdown 报告格式逐条输出重复代码块详见 CPD 报告格式文档命令行选项C 支持--ignore-literal与--ignore-identifiers7.7--ignore-sequences7.0PMD 与 CPD 从 7.14.0 起共享文件收集参数如--exclude-file-list、--report-file等匹配质量7.1.0 修复了重叠/部分重叠重复报告的缺陷现在只报告最长且不重叠的重复错误处理7.3.0 引入退出码 5 表示发生可恢复错误解析/词法/规则异常并新增--no-fail-on-error参数恢复旧行为--skip-lexical-errors相应废弃。七、工程、安全与分发实践Docker 镜像7.13官方镜像支持容器内直接分析例如docker run --rm --tty -v $PWD:/src pmdcode/pmd:latest check -d . -R rulesets/java/quickstart.xml签名发布7.10/7.11因旧 GPG 密钥口令泄露CVE-2025-232157.10.0 起改用新密钥A0B5CA1A4E086838签名 Maven Central 制品7.11.0 起二进制发行包也提供签名验证方法见 签名发布文档安全修复7.22修复 VBHTMLRenderer 与 YAHTMLRenderer 因未转义违规消息导致的存储型 XSS默认html格式不受影响但抑制标记存在类似问题构建要求7.18.0 起构建需要 Java 177.21.0 起需要 Java 21但产物始终兼容 Java 8 运行时内部现代化ANTLR 从 4.9.3 升级到 4.13.27.25ANTRL 语言模块需重新生成词法/语法分析器、日志体系改用 slf4j、测试迁移到 JUnit 5、默认分支改为main7.6。八、升级到 PMD 7 的注意事项综合各版本发布说明从 6.x 升级到 7.x以及 7.x 内部跨版本升级需要重点关注规则集路径与规则名category/vf/*→category/visualforce/*、category/vm/*→category/velocity/*被移除/重命名的规则需按 迁移指南 逐一核对属性框架多值属性分隔符改为逗号统计类规则的topscore/sigma属性被移除minimum类型改为整数Java 规则的方法/类违规位置收窄到标识符XPath 版本violationSuppressXPath及 XPath 规则默认使用 3.1从 6.x 升级需重新校验表达式CLI/退出码统一为pmd check/cpd/designer子命令注意 7.3.0 起的退出码 5 语义与--no-fail-on-errorJava preview 版本跟随每个大版本迁移NN-preview参数旧 preview 版本会被移除实验性 API7.x 存在大量 Experimental API如 Kotlin 属性视图、语言方言升级时需关注 API 变更说明 与 japicmp 检查结果。总结PMD 7.x 用两年多时间完成了一次「从内核到体验」的全面现代化Java 模块按 JLS 重写、Kotlin/Swift/CSS/Rust 等语言持续加入、CPD 报告与 CLI 走向统一规范、规则体系在命名、位置与准确性上不断收敛、供应链安全与发布工程逐步完善。对于正在使用或评估 PMD 的团队本文梳理的版本演进脉络既是升级路线的参照也是理解 PMD 7 设计取舍如类型感知分析、单行警告、XPath 3.1的入口。赞分享静态分析代码质量【免费下载链接】pmdAn extensible multilanguage static code analyzer.项目地址https://gitcode.com/gh_mirrors/pm/pmd点击查看免费下载相关推荐PredictionIO 版本演进全解析从 0.8.6 到 0.14.0 的架构升级与关键能力盘点PredictionIO 版本演进全解析从 0.8.6 到 0.14.0 的架构升级与关键能力盘点 PredictionIO后文简称 PIO是一个面向开发人工智能机器学习后端模型推理服务大数据Proxmark3 FM11RF08S 恢复脚本Windows 和 Termux 也能用了Proxmark3 FM11RF08S 恢复脚本Windows 和 Termux 也能用了 酒店卡读卡读到「静态加密 nonce」报错、标准攻击全部失效时P渗透测试嵌入式物联网网络安全react-diagrams 7.x 版本演进实录demo 项目从 Lerna 到 Pnpm Changesets 的工程化重构全解析react diagrams 7.x 版本演进实录demo 项目从 Lerna 到 Pnpm Changesets 的工程化重构全解析 本篇文章以 diaUI组件前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考