PMD使用说明

目录
静态分析工具PMD使用说明    1
目录    2
1.    编写目的    3
2.    PMD简介    4
3.    PMD的安装和运行    4
3.1安装并从命令行运行PMD    4
3.2在Eclipse中安装PMD插件运行方式    6
3.3 使用Ant进行调用    8
4.    关于PMD规则    10
5.    编写自定义的PMD规则    15
6.    结束语    18
7.    参考资料    18

1. 目的
质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤其是企业应用软件系统来说,除了软件运行质量、文档质量以外,代码的质量也是非常重要的。软件开发进行到编码阶段的时候,最大的风险就在于如何保证代码的易读性和一致性,从而使得软件的维护的代价不会很高。
在软件开发的过程中,以下几种情形随处可见:
1) 软件维护时间长,而且维护人员的积极性不高:
做过软件维护的开发人员,尤其是在接手不是自己开发产品的源码的时候,即使有良好的文档说明,仍然会对代码中冗长、没有注释的段落“叹为观止”。理解尚且如此困难,何况要修改或者增加新的功能。因此,很多开发人员不愿意进行软件维护的工作。
2)新的开发人员融入团队的时间比较长:
 除了没有良好的培训、文档等有效的机制以外,每个人一套的编码风格,也容易造成新成员对于已有代码的理解不够,甚至出现偏差。
提高代码的质量,除了要提高逻辑上的控制以及业务流程的理解外,代码本身也存在提高的空间,例如一些潜在的问题可以很早的就避免。类似于编码规范上的内容,如果全靠编码人员java可以开发什么软件进行自行检查,那么无疑需要很大的工作量,如果可以使用代码的静态检查工具进行检查的话,那么将大大的提高编码的效率。
项目组目前代码检查的工作基本上都是通过人工的方式,实行起来比较困难,检查的效果也不是很明显。PMD正是这样一种工具,可以直接使用它自带的规则(当然也可以使用自己的规则)对Java源程序进行分析出程序存在的问题,可以很大程度上的减轻代码检查工作的繁琐,为项目组今后的维护和开发工作起到指导的作用。
本文主要介绍了如何使用pmd工具进行代码的自动化检查,以规避一些潜在的问题并出代码的逻辑错误。
2. PMD简介
PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以出Java源程序的许多问题,例如:
® 潜在的bug:空的try/catch/finally/switch语句
® 未使用的代码:未使用的局部变量、参数、私有方法等
® 可选的代码:String/StringBuffer的滥用
® 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
® 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
® 循环体创建新对象:尽量不要再forwhile循环体内实例化一个新对象
@ 资源关闭:ConnectResultStatement等使用之后确保关闭掉
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD出所有创建ThreadSocket对象的操作。
3. 工作原理
PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCCEBNF(扩展巴科斯-诺尔范式,Extended Backus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(ASTAbstract Syntax Tree)。显然,这句话不那么好懂,且看下文具体说明。 

  从根本上看,Java源代码只是一些普通的文本。不过,为了让解析器承认这些普通的文本是合法的Java代码,它们必须符合某种特定的结构要求。这种结构可以用一种称为EBNF的句法元语言表示,通常称为“语法”(Grammar)。JavaCC根据语法要求生成解析器,这个解析器就可以用于解析用Java编程语言编写的程序。 

  不过实际运行中的PMD还要经过JJTree的一次转换。JJTree是一个JavaCC的插件,通过
AST扩充JavaCC生成的解析器。AST是一个Java符号流之上的语义层。有了JJTree,语法分析的结果不再是“System, ., out, ., . println”之类的符号序列,而是一个由对象构成的树型层次结构。例如,下面是一段简单的Java代码以及与之对应的AST 

Java源代码:
public class Foo {
public void bar() {
System.out.println("hello world");
}
}
对应的抽象语法树
CompilationUnit
TypeDeclaration
ClassDeclaration
UnmodifiedClassDeclaration
ClassBody
ClassBodyDeclaration
MethodDeclaration
ResultType
MethodDeclarator
FormalParameters
Block
BlockStatement
Statement
StatementEXPression
PrimaryExpression
PrimaryPrefix
Name
PrimarySuffix
Arguments
ArgumentList
Expression
PrimaryExpression
PrimaryPrefix
Literal
4. PMD的安装和运行
4.1安装并从命令行运行PMD
你可以从PMD的网站下载PMD的二进制版本,或下载带源代码的版本,下载得到的都是ZIP文件。假设你下载了二进制版本,先把它解压缩到任意一个目录。接下来怎么做,就要看你准备怎么用它——最简单的,如果要在一个Java源代码目录中运行PMD,只需直接在命令行上运行下面的命令:
E:\SoftWare\pmd-bin-4.2.1\pmd-4.2.1\bin>java -jar ..\lib\pmd-4.2.1.jar D:\ebsser
vice\ebsservice\src text l
输出结果类如:
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\SMPolicyInput.java:
51      Avoid unused private fields such as 'logger'.
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\SMPolicyShow.java:2
5      Avoid unused private fields such as 'logger'.
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\SMQueryPolicyByPoli
cyNo.java:32    Avoid unused local variables such as 'visaStatus'.
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\SMQueryPolicyByPoli
cyNo.java:44    Avoid unused local variables such as 'temp'.
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\erisk\ESMPolicyInpu
t.java:28      Avoid unused private fields such as 'logger'.
D:\ebsservice\ebsservice\src\com\sinosoft\service\policy\ebs\jrisk\JSMPolicyInpu
t.java:22      Avoid unused private fields such as 'logger'.
一些可以加载必须参数前面或者后面的可选参数如下:
-debug: 打印debug日志信息
-targetjdk: 指定目标源代码的版本- 1.3, 1.4, 1.5, 1.6 or 1.7;
默认是1.5
-cpus: 指定创建的线程数
-encoding: 指定PMD检查的代码的编码方式
-excludemarker: 指定PMD需要忽略的行的标记,默认为NOPMD
-shortnames: 在报告中显示缩短的文件名
-linkprefix: HTML源文件的路径,只是为了HTML显示
-lineprefix: 自定义的锚,用于影响源文件中的行,只是用于HTML显示
-minimumpriority: 规则的优先级限制,低于优先级的规则将不被使用
-nojava: 不检查java文件,默认是检查java文件
-jsp: 检查JSP/JSF文件,默认不检查
-reportfile: 将报告输出到文件,默认是打印在控制台
-benchmark: 输出一个基准清单,默认输出到控制台
-xslt: 覆盖默认的xslt
-auxclasspath: 指定源代码文件使用的类路径
 
例如在windows系统中,例子如下:
c:\> java -jar pmd-4.2.1.jar c:\my\source\code text unusedcode,imports -targetjd

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。