最近项目组要求使用PMD工具,通过自定义规则来检查代码,接录部分文档内容如下:
PMD介绍
PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:
® 潜在的bug:空的try/catch/finally/switch语句
® 未使用的代码:未使用的局部变量、参数、私有方法等
® 可选的代码:String/StringBuffer的滥用
® 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
® 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
® 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象
@ 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。
安装并从命令行运行PMD
你可以从PMD的网站下载PMD的二进制版本,或下载带源代码的版本,下载得到的都是ZIP文件。假设你下载了二进制版本,先把它解压缩到任意一个目录。接下来怎么做,就要看你准备怎么用它——最简单的,如果要在一个Java源代码目录中运行PMD,只需直接在命令行上运行下面的命令:
E:SoftWarepmd-bin-4.2.1pmd-4.2.1bin>java -jar ..libpmd-4.2.1.jar D:ebsser
viceebsservicesrc text rulesets/unusedcode.xml
输出结果类如:
D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyInput.java:
51Avoid unused private fields such as 'logger'.
D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyShow.java:2
5Avoid unused private fields such as 'logger'.
D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli
cyNo.java:32Avoid unused local variables such as 'visaStatus'.
D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli
cyNo.java:44Avoid unused local variables such as 'temp'.
D:ebsserviceebsservicesrccomsinosoftservicepolicyebseriskESMPolicyInpu
t.java:28Avoid unused private fields such as 'logger'.
D:ebsserviceebsservicesrccomsinosoftservicepolicyebsjriskJSMPolicyInpu
t.java:22Avoid 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:mysourcecode text unusedcode,imports -targetjd
k 1.5 -debug
c:> java -jar pmd-4.2.1.jar c:mysourcecode xml basic,design -encoding UTF-8
c:> java -jar pmd-4.2.1.jar c:mysourcecode html typeresolution -auxclasspath
commons-collections.jar;derby.jar
在Eclipse中安装PMD插件运行方式
PMD可以作为插件集成到很多流行的IDE中,很多的插件中都包含了PMD的jar文件,这个jar文件中包含了规则集。所以虽然一些插件中使用rulesets/unusedcode.xml来作为参数引用规则集,但是实际上是使用getResourceAsStream()方法来从PMD的jar文件中加载。
由于Eclipse是比较流行的开源Java/J2EE开发IDE,所以本文主要介绍如何在Eclipse中使用PMD工具进行代码的检查
安装基于Eclipse IDE的插件
安装Eclipse的PMD插件的过程如下:
® 启动Eclipse
® 选择Help-->Software Updates-->Find and Install
® 选择Next,选择New remote site
® 在Name框中输入PMD,URL框中输入http://pmd.sf.net/eclipse
® 在之后的对话框中一直点击下一步或者接受协议,完成Eclipse的PMD插件的安装
也可以通过下载最新的zip文件按,然后执行上述过程,只是使用New locale site来代替New remote site,并使用下载的zip文件。
可以通过Windows-->Preferences来配置PMD。
通过右键一个项目,然后选择PMD-->Check node with PMD,即可使用PMD工具检查代码。如果要进行重复代码检测,那么右键一个项目后,选择PMD-->Find suspect cut and paste。检查结果会放在reports目录下,文件名为cpd-report.txt。
可以通过使用Eclipse的帮助系统来查看PMD插件的文档。
在安装完更新后,如果发生了一个异常,例如”java.lang.RuntimeException: Could not find that class xxxx”,这时试着删除workspace中的.metadata/plugins/net.sourceforge.pmd.eclipse目录下的ruleset.xml文件。
使用PMD
1、启动Eclipse IDE,打开工程,选择 "Windows"->"Preferences"下的PMD项,其中Rules Configuration 项目可以配置PMD的检查规则,自定义检查规则也可以在此通过Import的方式导入到PMD中
2、配置好后,鼠标右键点击工程中需要检查的JavaSource,选择"PMD"->"Check Code With PMD" ,之后PMD就会通过规则检查你的JavaSource了并且将信息显示在PMD自己的视图上
3、示例
import java.util.*;
public class Test {
public static void main(String[] args) {
try{
if(true) {}
System.out.println("Hello World!");
} catch(Exception e) {
}
}
}
以上代码PMD会检查出:catch块中没有内容、if判断块中没有内容、代码中出现System.out.println等警告描述
DM