PMD 项目 Kotlin 使用策略解读:ADR-2 架构决策记录的技术内涵与仓库实证
静态分析代码质量【免费下载链接】pmdAn extensible multilanguage static code analyzer.项目地址https://gitcode.com/gh_mirrors/pm/pmd点击查看免费下载本文围绕 PMD 官方架构决策记录ADR 2 - Policy on the use of Kotlin for development位于 docs/pages/pmd/projectdocs/decisions/adr-2.md展开系统解读 PMD 团队在引入 Kotlin 时制定的边界与规则并结合当前仓库中的源码、Maven 配置与测试代码验证这些决策的实际落地情况。读完本文你将理解PMD 为什么对 Kotlin开放但设限、六条具体决策规则各自的动机、pmd-core保持纯 Java 的兼容性含义以及语言模块在混合语言与纯 Kotlin 两种路径之间如何取舍。背景PMD 用 ADR 记录架构决策PMD 是一个有着二十多年历史的多语言静态代码分析工具详见 README.md长期以来大量架构决策仅存在于开发者脑中。为此项目引入了架构决策记录Architecture Decision RecordsADR机制——即 ADR 1所有重大决策以统一模板Context / Decision / Status / Consequences写入仓库随文档站点发布并通过 Pull Request 讨论、将状态从 Proposed 提升到 Accepted。所有已接受的 ADR 会汇总在 docs/pages/pmd/projectdocs/decisions.md 的索引页中。ADR 2 正是在这一机制下于 2022 年 7 月提出、同年 9 月被接受见其 Change History 章节它专门回答一个问题Kotlin 应该在 PMD 代码库中用到什么程度Context为什么此前对 Kotlin 保持谨慎ADR 2 的 Context 部分记录了决策时的三个现实约束现状是仅测试用 Kotlin当时 Kotlin 只出现在部分单元测试中例如pmd-lang-test模块提供了一批基于 Kotlin 的测试基类这点在 pmd-lang-test/pom.xml 的模块描述 This module uses Kotlin 中可得到印证。JetBrains IntelliJ IDEA 之外的开发支持不足Eclipse 的 Kotlin 插件按用户评价不能正常工作VS Code 虽有 Kotlin 插件但仅具备基础功能而 gitpod.io、GitHub Codespaces 等在线 IDE 大多基于 VS Code。这意味着在 PMD 中引入 Kotlin就等于接受PMD 只能靠 IntelliJ IDEA 开发这是一种事实上的供应商锁定vendor lock-in。多语言混合的维护成本在 Java 之外混入第二种语言会让维护与新人贡献门槛变高。不过文档也坦承PMD 本身就是一个处理数十种语言的工具这个理由的说服力有限。与此同时扩展 Kotlin 使用也有明确收益可以吸引更多贡献者Kotlin 开发者生态庞大也有利于在项目中开发小型 DSL。这些利弊权衡直接塑造了后面的决策内容。Decision六条规则界定 Kotlin 的边界ADR 2 的核心决策是总体上对在 PMD 中增加 Kotlin 的使用持开放态度但为了把扩展限制在可维护范围内制定了六条规则。规则一pmd-core必须保持纯 JavaThe modulepmd-coreshould stay in plain Java.pmd-core是所有语言模块共享的核心 API解析、规则、报告等基础设施。保持纯 Java 的首要目的是保持二进制兼容性——当源码变更时纯 Java 的核心可以最大程度避免兼容性破坏。文档同时解释了当时的背景PMD 目前所有模块是同步发布的所以兼容性压力暂时不大但未来各语言模块变更频率差异大若模块间能保持兼容就没有必要每次都整体发布——届时pmd-core的纯 Java 属性将更有价值。仓库实证在根 pom.xml 中Kotlin 编译插件kotlin-maven-plugin与 Kotlin 标准库依赖只在需要使用 Kotlin 的模块中生效而 pmd-core/pom.xml 的插件与依赖清单里没有任何 Kotlin 相关条目。从当前源码树看pmd-core的src/main与src/test下也确实不存在任何.kt文件——纯 Java并非口号而是被构建配置与源码现状共同维持的硬约束。规则二测试代码可以使用 KotlinFor (unit) testing, Kotlin can be used inpmd-coreand in the language modules.单元测试被明确列为可自由使用 Kotlin 的领域覆盖pmd-core与各语言模块。测试框架层面则给出了现状与目标pmd-test目前还未使用 Kotlin而pmd-lang-test已经使用。仓库实证pmd-lang-test正是 ADR 落地最典型的模块。其 src/main/kotlin 目录下提供了大量 Kotlin 测试基座例如BaseTextComparisonTest.kt把源码文件 dump 结果与基准文件比较的通用测试基类其子类包括CpdTextComparisonTest与BaseTreeDumpTestBaseParsingHelper.kt语言无关的解析器工具基类封装了parse、parseResource、executeRule等测试常用入口BaseTreeDumpTest.ktAST 结构 dump 对比测试基类。此外 pmd-lang-test/pom.xml 以compile作用域引入Kotestkotest-assertions-core-jvm、kotest-property-jvm、kotest-runner-junit5-jvm让这些 Kotlin 测试基类连同断言库一起自动对使用者可用。规则三语言模块可以按需选择实现语言from now on, we allow to have the individual language modules be implemented in different languages when it makes sense.各语言模块获得自主权可以继续用纯 Java像pmd-java现在这样也可以引入 Kotlin。这一条与 ADR 2 开头引入 Kotlin 可以增加贡献、便于开发 DSL的判断直接呼应——对于某些语法树构建、模式匹配密集的模块Kotlin 的表达力能显著降低实现成本。仓库实证pmd-apex模块是存量模块混入 Kotlin的现行案例。其生产代码 ApexTreeBuilder.kt约 830 行位于src/main/java目录下但以.kt为扩展名承担将 Apex 解析器产出转换为 PMD AST 的核心构建逻辑并由 ApexParser.java 以new ApexTreeBuilder(task, ...)直接调用。与此同时pmd-apex/pom.xml 也配置了kotlin-maven-plugin与 Kotlin 标准库依赖。也就是说Java 与 Kotlin 在同一个模块、同一份生产代码中混合协作是 ADR 规则三允许并已经发生的现实。规则四混合语言不得破坏纯 Java 使用方式When mixing languages (e.g. Java Kotlin), we need to care that the modules can still be used with plain Java.这是对下游用户的保护条款。以pmd-java为例它向自定义规则作者提供了符号表symbol table、类型解析type resolution等 API即便模块内部混入 Kotlin也不能强迫用户必须用 Kotlin 才能写自定义规则——至少对已经存在、且用户可能已用 Java 写过规则的语言模块如此。换言之Kotlin 是内部实现选项不是外部使用门槛。规则五全新语言模块允许纯 Kotlin实现It is also possible to write the entire language module in Kotlin only.对于全新的语言模块允许整模块用 Kotlin 实现此时规则四中混合语言的兼容性难题自然消失不存在历史 Java 规则。这条规则为未来以 Kotlin 优先Kotlin-first方式接入新语言留出了空间。仓库实证虽然目前各存量语言模块仍以 Java 为主但 PMD 已经拥有一个名为pmd-kotlin的模块——它负责分析 Kotlin 语言本身基于 ANTLR4 语法 KotlinParser.g4根节点KotlinFile、节点前缀Kt参见 pmd-kotlin/pom.xml说明 PMD 对 Kotlin 生态的重视而用 Kotlin 写新语言模块的通道则留给未来的新语言接入。规则六重构存量模块必须保持兼容否则就是主版本变更When refactoring an existing language module from Java only to introduce Kotlin, care needs to be taken to not make incompatible changes. If compatibility (binary or source) cant be maintained, then that would be a major version change.如果要把一个纯 Java 的存量语言模块重构为引入 Kotlin必须保证不产生不兼容变更一旦二进制或源码兼容性无法维持则该变更只能随主版本号MAJOR升级发布。这条规则与 ADR 3 确立的 API 演进原则Semantic VersioningMAJOR 用于不兼容变更internal/impl包与InternalApi、Experimental注解界定非公开 API形成呼应——Kotlin 引入的兼容性成本最终由版本策略来兜底。构建基础设施根 pom.xml 中的 Kotlin 管线上述规则能否落地取决于构建系统是否配套。根 pom.xml 集中定义了 Kotlin 相关的统一配置配置项值含义kotlin.version2.2.10Kotlin 编译器版本见 pom.xmlkotlin.compiler.apiVersion/languageVersion1.9语言特性 API 与语言版本兼容目标kotlin.compiler.jvmTarget${maven.compiler.test.target}与测试目标 JVM 字节码版本对齐kotest.version5.9.1Kotest 测试框架版本dokka.version2.0.0Kotlin 文档生成插件版本在插件管理段pom.xmlkotlin-maven-plugin通过add-test-source目标把src/test/kotlin注册为测试源码目录再依次执行kotlin-compile同时编译src/main/kotlin与src/main/java和kotlin-test-compile编译src/test/kotlin与src/test/javamaven-compiler-plugin的默认 compile/testCompile 被禁用改由 Java 编译执行点接管从而保证 Kotlin 与 Java 在同一模块中协同编译。pmd-lang-test还通过 dokka-maven-plugin 生成 Kotlin 文档。Consequences收益与代价并存ADR 2 明确承认这一决策是双刃剑收益面更多 Kotlin 开发者可以参与贡献内部开发小型 DSL领域专用语言变得更容易打开了通向更多语言的可能性——文档明确提到未来不限于 Kotlin例如pmd-scala模块使用 Scala 也是合理方向当前仓库确实存在 pmd-scala-modules/pmd-scala-common 模块其部分测试已用 Kotlin 编写如 ScalaParserTests.kt。代价面除 IntelliJ IDEA 之外的 IDE 在阅读 PMD 源码时会遇到困难Eclipse 实际上将无法继续实用维护一个多语言polyglot代码库的复杂度更高。测试侧的大规模实践pmd-java 的 Kotlin 测试生态规则二测试可用 Kotlin在pmd-java中得到了最大规模的实践。该模块在 src/test/kotlin 下积累了上百个 Kotlin 测试文件覆盖 AST 节点测试、符号解析symbols包、类型系统types包含internal/infer下的类型推断测试等领域。其中 KotlinTestingDsl.kt 是一个典型的DSL 开发成果它基于 Kotest 与tree-matchers/tree-printers库com.github.oowekyala.treeutils构建了一套节点匹配 DSL——例如JavaVersion枚举支持J9..J11这种区间运算符、shouldMatchNode让断言以声明式写出并统一约定不变量断言javaImplicitAssertions如isParenthesized必须与parenthesisDepth 0一致。这与 ADR 2 中Kotlin 便于开发小型 DSL的动机完全吻合。需要再次强调边界这些 Kotlin 测试全部位于测试源码树pmd-java的生产代码仍是纯 Java且 pmd-java/pom.xml 只为测试引入kotlin-maven-plugin与kotlin-stdlib、kotlin-test-junit——这正是规则四混合语言不影响用户以纯 Java 使用模块的典型体现。小结ADR 2 的实践价值从 ADR 2 出发结合仓库现状可以提炼出 PMD 的 Kotlin 落地路径核心保持纯 Java 以守护兼容性底线测试代码放开使用 Kotlinpmd-lang-test、pmd-java 测试均以此构建测试 DSL语言模块生产代码按需引入pmd-apex 的 ApexTreeBuilder.kt 已是 Java/Kotlin 混编实例未来新语言模块可走纯 Kotlin 路线任何不兼容变更都必须以主版本升级为代价。这条路径既利用了 Kotlin 的表达力与生态吸引力又通过版本策略与 API 原则ADR 3把兼容性风险控制在明确边界内是大型多语言静态分析项目引入第二语言的参考范本。状态与变更历史状态Accepted已接受最近更新2024 年 2 月对应 7.0.02022-09-30状态由 Proposed 改为 Accepted2022-07-28提出初始版本赞分享静态分析代码质量【免费下载链接】pmdAn extensible multilanguage static code analyzer.项目地址https://gitcode.com/gh_mirrors/pm/pmd点击查看免费下载相关推荐使用 ADR 模板记录架构决策Atlantis 项目的架构决策记录实践指南使用 ADR 模板记录架构决策Atlantis 项目的架构决策记录实践指南 导读 本文围绕 Atlantis 仓库中的 docs/adr/template.mDevOpsCI/CD基础设施Volcano 与 Kubernetes 版本兼容矩阵从 v1.6 到 HEAD 的完整版本适配指南Volcano 与 Kubernetes 版本兼容矩阵从 v1.6 到 HEAD 的完整版本适配指南 Volcano 作为运行在 Kubernetes 之上的5分钟上手万能模组管理器 Reloaded-II一篇文章讲透跨游戏装模组的全流程5分钟上手万能模组管理器 Reloaded II一篇文章讲透跨游戏装模组的全流程 你同时玩着《索尼克英雄》《索尼克滑板》和《血源诅咒》每个游戏都想装高清纹理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

银行电话营销预测:Python机器学习完整项目实战与避坑指南

银行电话营销预测:Python机器学习完整项目实战与避坑指南

简介:这份资源面向希望进入金融风控与客户行为预测领域的数据科学学习者,提供一套完整的银行客户认购产品预测实战方案。项目以Python为工具,覆盖从数据清洗、特征工程到模型训练与评估的全流程,帮助理解哪些客户特征会影响金融产…

2026/10/13 2:28:30 阅读更多 →
机器学习增强技术面与基本面分析:量化策略实战

机器学习增强技术面与基本面分析:量化策略实战

机器学习增强技术面与基本面分析,这个话题我盯了很久。做了几年量化研究,最深的感受就是:传统技术指标和基本面财务数据,单拎出来用,噪声大、规律不稳定,回测曲线稍微顺滑一点就忍不住怀疑是过拟合还是幸存…

2026/10/13 2:28:30 阅读更多 →
Prodigy发布增强版PGY-I3C-EX-PD协议训练器,成为全球业界功能最强大的I3C验证工具

Prodigy发布增强版PGY-I3C-EX-PD协议训练器,成为全球业界功能最强大的I3C验证工具

Prodigy推出业界第一家功能最强大的I3C协议训练器,协议测试验证能力全面增强。增强版PGY-I3C-EX-PD使工程师能够验证基于I3C的应用层协议,包括MCTP、NVMe-MI、SPDM和PLDM。PGY-I3C-EX-PD提供集协议训练、流量生成、协议解码及错误分析于一体的平台&#…

2026/10/13 2:28:30 阅读更多 →

最新新闻

小白程序员必备:收藏!从零开始掌握 Codex 大模型核心技术

小白程序员必备:收藏!从零开始掌握 Codex 大模型核心技术

本文深入解析 Codex 大模型的六层架构,涵盖模型、Runtime、Context、Tool、Sandbox 和 Environment 的功能与关系。通过分析 Agent Loop 的工作原理,揭示 Token 的计量方式以及 Context Window 与 Memory 的关联。文章还探讨了长任务中出现的“忘记”现象…

2026/10/13 3:18:47 阅读更多 →
小白程序员也能逆袭!75天零基础拿下字节大模型Agent实习Offer,附学习路线+面试秘籍

小白程序员也能逆袭!75天零基础拿下字节大模型Agent实习Offer,附学习路线+面试秘籍

本文分享作者从零基础转行大模型Agent方向的75天经验,涵盖LLM基础学习、Agent框架掌握、项目实战和面试技巧。强调Agent方向的优势和字节等大厂的招聘需求,提供详细学习时间线和核心知识点清单。 双非硕从零转行大模型Agent方向,75天拿下字节…

2026/10/13 3:18:47 阅读更多 →
标准引领,信任赋能:SGS以权威认证审核铸就高质量发展基石

标准引领,信任赋能:SGS以权威认证审核铸就高质量发展基石

在全球化竞争日益激烈、监管要求日趋严格的今天,“认证”已成为企业进入市场的“通行证”、赢得客户信任的“信用证”以及实现可持续发展的“导航仪”。作为国际公认的测试、检验和认证机构,SGS凭借其跨越145年的卓越经验与瑞士公司特有的精准度&#xf…

2026/10/13 3:18:47 阅读更多 →
31岁在职备考软考高项经验分享:白天上班夜里刷题,二战三科50+的逆袭之路

31岁在职备考软考高项经验分享:白天上班夜里刷题,二战三科50+的逆袭之路

我31岁,做项目管理,白天上班,晚上等孩子睡了才能翻开书。第一次考高项,案例38分,没过。第二次调整方法,案例52分,三科一次过。 在职备考最大的痛就三个:时间碎、资料乱、案例论文不会…

2026/10/13 3:18:47 阅读更多 →
SpringBoot+Vue小区购物系统毕设:从架构设计到部署答辩全攻略

SpringBoot+Vue小区购物系统毕设:从架构设计到部署答辩全攻略

直接说结论:这个题目选得聪明。SpringBoot Vue 是目前 Java Web 方向使用频率最高的前后端分离组合,而"小区购物系统"又是一个业务逻辑非常完整、功能边界清晰的场景——有用户、有商品、有订单、有配送、有权限管理。对毕设来说,…

2026/10/13 3:18:47 阅读更多 →
小白程序员必备:从概念到实践,打造你的第一个 Agent 系统

小白程序员必备:从概念到实践,打造你的第一个 Agent 系统

本文深入浅出地介绍了 Agent 系统的概念、运行机制以及如何将其转化为可靠的系统。通过实际案例分析,详细阐述了 Agent Loop 的运行过程,以及模型、Runtime 和工具在其中的角色和职责。文章还探讨了如何避免 Agent 原地打转的问题,并简要介绍…

2026/10/13 3:17:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →