什么是PMD?10 Sept 2024 | 5 分钟阅读 PMD是一个开源的静态源代码分析器,用于报告应用程序代码中发现的问题。PMD集成了规则集中的工作,并支持编写自定义规则的能力。PMD不报告编译错误,因为它只能处理格式正确的源文件。PMD报告的问题是效率低下的代码或不良的编程习惯,如果它们积累起来,会降低程序的性能和效率。它可以分析用Java、JavaScript、Apex和Visualforce、PLSQL、Apache Velocity、XML和XSL编写的文件。 此外,它还包含CPD,即复制粘贴检测器。CPD在Java、C、C++、C#、Groovy、PHP、Ruby、Fortran、JavaScript、PLSQL、Apache Velocity、Scala、Objective C、Matlab、Python、Go、Swift和Salesforce.com Apex和Visualforce中查找重复代码。 虽然PMD没有正式代表任何东西,但已经提出了一些逆向首字母缩略词,例如“编程错误检测器”(Programming Mistake Detector)和“项目按时完成”(Project Meets Deadlines)。 PMD的工作原理
PMD工作规则在运行规则之前,PMD会将源文件解析成一个名为抽象语法树(AST)的数据结构。此树表示代码的句法结构,并编码源代码组件之间的句法关系。 例如,在Java中,方法声明属于一个类:在AST中,表示方法声明的节点将是表示其封闭类声明的节点的后代。因此,这种表示比原始源代码(对于程序而言,只是一串字符)或词法分析器生成的符号链(例如Checkstyle处理的)要丰富得多。 从概念上讲,PMD规则通过将“模式”与文档的AST进行匹配来工作。规则检查AST并找到满足特定项目所需条件的节点,这些条件是规则试图标记的。然后,规则会在这些节点上报告违规。 在不同操作系统中安装PMD1. Windows
2. Linux操作系统
3. Mac操作系统
4. Windows (Chocolatey)
编写新规则PMD支持两种定义规则的方法:使用XPath查询或使用Java访问者。XPath规则设置起来容易得多,因为它们直接在您的规则集XML中定义,并且对于几乎任何任务都足够表达。 另一方面,PMD的一些编程接口只能从Java访问,例如获取语句的使用。此外,Java规则允许您进行一些复杂的处理,这是XPath规则无法实现的。 最终,选择哪种方法取决于您的规则的难度。除非您没有其他选择,否则我建议您坚持使用XPath。 在XML中定义新规则新规则在被引用之前必须在规则集中声明。XPath和Java规则都是如此。为此,使用标准元素,但不是引用ref属性,而是指定具有标准执行类的类特性。 示例 https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.49.0/pmd-bin-6.49.0.zip PMD中的文档文档源可以根据其生成方式在两个地方找到
手写文档 所有手写文档都存储在docs/pages下的子文件夹中。文件夹结构类似于侧边栏结构。由于所有页面都使用简单的永久链接,因此在渲染的HTML页面中,所有页面都平铺在一个目录中。这使得离线查看文档也很容易。 规则文档 语言%lang%的类位于pmd-%lang%/src/primary/assets/classification/%lang%。因此,对于Java,可以在pmd-java/src/primary/assets/classification/java下找到这些类。此目录中的XML分类文件在集成期间转换为描述其所含规则的Markdown页面。这些页面像手写文档一样放置在docs/下,然后像大多数文档一样使用Jekyll进行渲染。标准文档生成器是不同的子模块pmd-doc。 因此,更改标准文档不应在Markdown页面上进行,而应直接在与标准对应的XML规则标签中,在重要的分类文件中进行。 规则的XML文档可以包含GitHub风味的Markdown。只需将Markdown包含在XML的CDATA区域内即可。CDATA区域保护分隔符内的所有格式,并允许它们编写代码示例而无需转义特殊的XML字符。 示例 |
数据访问对象模式,通常称为 DAO 模式,用于将高层业务服务与低层数据访问 API 或操作分开。数据访问对象模式的成员列于下文。数据访问对象接口:数据访问对象接口指定了……
阅读 3 分钟
Java 中的 ParseException 是一个检查型异常。当由于格式不正确而无法将日期字符串解析为 Date 对象时,会发生此异常。SimpleDateFormat.parse() 等方法会抛出此异常,通常是由于日期模式不匹配或日期值无效,导致...
7 分钟阅读
在 Java 中,交换或替换对象可以通过将一个对象的值赋给另一个对象并反之来实现。可以通过使用临时变量来保存一个对象的值,同时将其与另一个对象的值交换来实现...
5 分钟阅读
在编程中,排序很重要,因为它将数组的元素按特定顺序排列。最常用的顺序是字母顺序或自然顺序。排序用于规范化(将数据转换为标准形式的过程)数据并生成... (省略了其他部分)
阅读 3 分钟
处理键值对数据是各种 Java 应用程序中的常见需求。通常,数据以字符串或字符串数组的形式到达,并将其转换为 Map 以进行有效处理变得至关重要。在同一上下文中,Map 提供了一种便捷的方式来访问和操作数据...
5 分钟阅读
问题陈述:给定一个数组 nums。该问题确定数组中索引的最大集合,使得对于每个选定的索引 i,都存在另一个选定的索引 j,其中 A[i] ≤ 2 × A[j]。任务是找到标记的最大可能数量...
阅读 6 分钟
在本节中,我们将学习什么是技术数以及如何通过 Java 程序找到技术数。技术数 如果一个数字有偶数位,并且可以精确地分割成...,则该数字称为技术数。
阅读 3 分钟
在 Java 中,Object 类属于 java.lang 包。它是所有 Java 类的父类,因此位于类层次结构的顶部。这意味着每个 Java 类直接或间接继承 Object 类的所有方法....
7 分钟阅读
工程师可以轻松地为他人创建一个网站,并激励他们开始创业。事实上,如果你没有选择正确的支付网关服务,有效地运营一家初创公司可能会很麻烦。正确的支付网关服务...
阅读 12 分钟
给定一个数组arr[],任务是找到数组中最长序列的长度,该序列形成算术级数。示例1:输入:int arr[] = {30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140}; 输出:12 说明:……
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India