PMD是一个源代码分析器。它会发现常见的编程缺陷,如未使用的变量、空的 catch 块、不必要的对象创建等。它支持多种语言。它可以使用自定义规则进行扩展。它使用 JavaCC 和 Antlr 将源文件解析为抽象语法树 (AST) 并针对它们运行规则以查找违规行为。规则可以用 Java 或使用 XPath 查询编写。
它支持 Java、JavaScript、Salesforce.com Apex 和 Visualforce、Modelica、PLSQL、Apache Velocity、HTML、XML 和 XSL。支持 Scala,但目前没有可用的 Scala 规则。
此外,它还包括CPD,即复制粘贴检测器。CPD 在 C/C++、C#、Dart、Fortran、Gherkin、Go、Groovy、HTML、Java、JavaScript、JSP、Kotlin、Lua、Matlab、Modelica、Objective-C、Perl、PHP、PLSQL、Python、Ruby 中查找重复代码、Salesforce.com Apex 和 Visualforce、Scala、Swift、T-SQL 和 XML。
PATH
.
在 Linux 上,您可以通过添加PATH=$PATH:*path_to_pmd*/bin/
到您的~/.bashrc
/~/.zshrc
文件来执行此操作。
在 Windows 上,这是通过以下方式实现的:
*path_to_pmd*/bin/
在分号后添加适当的值。pmd
(pmd.bat
在 Windows 下)运行它们中的任何一个。bin/
第一个参数是您要执行的实用程序的名称('check'、'designer'、...),例如 PMD 是通过启动的pmd check
。其余参数特定于所使用的实用程序。
pmd check
或pmd.bat check
)至少需要一个选项和一个来源列表:
-R <path>
:您要使用的规则集文件。PMD 使用称为规则集的 xml 配置文件,它指定要在您的源上执行的规则。您还可以通过使用其类别和名称来引用它来运行单个规则(此处有更多详细信息)。例如,您可以使用-R category/java/codestyle.xml/UnnecessaryModifier
.<source> …
:要分析的来源的路径。这可以是文件名、目录或包含源的 jar 或 zip 文件。或者,您可以使用-d
or--dir
标志,这是等效的。rulesets/java/basic.xml
)已弃用,但您仍然可以使用它们。PMD 包含一些语言(目前是 Java)的快速入门规则集作为基本配置,您可以将其作为 eg 引用rulesets/java/quickstart.xml
。不过,强烈建议您从一开始就创建自己的规则集。-f <format>
: 报告格式。PMD 支持许多开箱即用的报告格式。您可能希望从基本 text
格式(默认)或xml
格式开始。支持的格式在此处记录。--aux-classpath <classpath>
:包含已分析 Java 源代码的已编译类文件的类路径(如果有)。正确设置它允许 PMD 使用反射进行更深入的分析。某些规则(例如MissingOverride)要求它正常运行。text
:
~ $ pmd check -f text -R rulesets/java/quickstart.xml src/main/java
.../src/main/java/com/me/RuleSet.java:123 These nested if statements could be combined
.../src/main/java/com/me/RuleSet.java:231 Useless parentheses.
.../src/main/java/com/me/RuleSet.java:232 Useless parentheses.
.../src/main/java/com/me/RuleSet.java:357 These nested if statements could be combined
.../src/main/java/com/me/RuleSetWriter.java:66 Avoid empty catch blocks
pmd cpd
,在 Windows 上由启动pmd.bat cpd
,它需要一个选项和一个源列表:
--minimum-tokens <number>
:应报告为重复的最小令牌长度。<source> …
:要分析的来源的路径。这可以是文件名、目录或包含源的 jar 或 zip 文件。或者,您可以使用-d
or--dir
标志,这是等效的。text
:
~ $ pmd cpd --minimum-tokens 100 /home/me/src
Found a 7 line (110 tokens) duplication in the following files:
Starting at line 579 of /home/me/src/test/java/foo/FooTypeTest.java
Starting at line 586 of /home/me/src/test/java/foo/FooTypeTest.java
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());