阅读该文章前,最好已经对 PMD 有了初步的认识和了解,可参考静态分析工具 PMD 使用说明
准备工作
首先在PMD 官网下载最新版本的文件,目前最新版本是 5.4.1。
下载 pmd-bin-5.4.1.zip 和 pmd-src-5.4.1.zip 之后解压备用。
pmd-src-5.4.1 是 PMD 源码包,是无法直接执行的。
pmd-bin-5.4.1 是 PMD 的可执行包。
目录简介
pmd-bin-5.4.1【PMD 可执行版本】
bin
designer.bat【界面工具,能将 java 源代码转化为 AST(抽象语法树),个人推荐使用】
bgastviewer.bat【界面工具,与 designer.bat 功能相似】
cpd.bat【用来查找重复代码的工具,命令行版】
cpdgui.bat【用来查找重复代码的工具,GUI 版】
pmd.bat【Window 平台下运行 PMD 需要使用的文件】
run.sh【Linux 平台下运行 PMD 需要使用的文件】
lib【该目录存放 PMD 运行依赖的 jar 包,包括第三方 jar 包和各种语言的模块 jar 包】
pmd-src-5.4.1【PMD 源代码版本】
pmd-core【PMD 的核心执行调度模块】
pmd-java【针对 java 语言的检测模块】
src ->main
java -> net -> sourceforge -> pmd -> lang->java【目录太深,在此处聚合】
rule【该目录下存放已经编写好的 java 规则文件】
basic【基础类规则】
AvoidBranchingStatementAsLastInLoopRule.java【避免在循环的最后使用分支语句】
AvoidMultipleUnaryOperatorsRule.java【避免一元运算符的多重使用】
...【其他基础类的规则文件】
codesize【代码体积类规则】
...【各种规则类别的目录,包含该类别的 java 编写的规则文件】
resources
rulesets【java 规则对应的 xml 文件】
java
android.xml【PMD 运行时使用该文件会调用安卓类规则进行扫描】
basic.xml【PMD 运行时使用该文件会调用基础类规则进行扫描】
...【其他类别的规则 xml 文件】
etc
grammar
Java.jjt【AST 抽象语法树生成所需的语法文件】
pmd-java8【新增对 java1.8 版本的支持模块】
pmd-javascript【针对 javascript 语言的检测模块】
pmd-jsp【针对 jsp 语言的检测模块】
...【其余的主要是针对不同语言实现的独立的检测模块】
自定义规则实现思路
明确想要自定义的规则。
列举会触犯这种规则的所有不同的写法。
使用 designer.bat 分析所有写法的抽象语法树的特点。
编写规则代码捕捉这种特点。
创建自己的 xml 规则文件,内容包括规则的相关信息。
运行 PMD 扫描错误代码,验证是否能触发自定义规则。
下面以一个比较简单的规则举例,详细的阐述一下实现这个规则的具体步骤,帮助大家快速上手。
目前 PMD 支持两种编写规则的方法:
使用 Java 进行编写
使用 XPath 表达式
我首先选择第一种 Java 编写方式进行讲解。
****
1. 明确想要自定