PMD 扫描Java源代码并且寻找潜在的问题像:
•可能存在的bug - 空的try/catch/finally/switch语句
•Dead code - 未用过的local变量, 参数和私有方法
•不最适宜的代码 - 浪费的String/StringBuffer用法
•过度复杂的表达式- 多余的if语句, for循环that could be while循环
•重复的代码- 复制/粘贴的代码意味着复制/粘贴的bug
Tom Copeland 的 PMD 是一个开源(BSD 许可)工具,它分析 Java 源代码,找出潜在的 bug。在一般意义上来说,它与 FindBugs 和 Lint4j 这类工具类似。但是,所有这些工具找出的 bug 各不相同,所以在给定代码基址上把这些工具都运行一遍很有好处。您也可以把 PMD 与 Ant 集成在一起,以便进行自动源代码检查,而且还可以将 PMD 与一些可用于大多数主要 IDE 和程序员编辑器的插件集成在一起,本文介绍Eclipse IDE 下PMD的插件。
一、安装基于Eclipse IDE的插件
1、启动Eclipse IDE,打开工程
2、选择"Help"->"Software Updates"->"Find and Install"
3、点击"Next", 点击"New remote site"创建一个远程站点连接
4、输入此站点的描述名称,例如:“PMD Plus” ,然后输入安装地址"http://pmd.sf.net/eclipse",遵守协议,然后一路next,直至更新完毕重启Eclipse IDE
二、使用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等警告描述
三、关于PMD规则
1、PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:
基本(rulesets/basic.xml)—— 规则的一个基本合集,可能大多数开发人员都不认同它: catch 块不该为空,无论何时重写 equals(),都要重写 hashCode(),等等。
命名(rulesets/naming.xml)—— 对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
未使用的代码(rulesets/unusedcode.xml)—— 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。 设计(rulesets/design.xml)—— 检查各种设计良好的原则,例如: switch 语句应当有 default 块,应当避免深度嵌套的 if 块,不应当给参数重新赋值,不应该对 double 值进行相等比较。 导入语句(rulesets/imports.xml)—— 检查 import 语句的问题,比如同一个类被导入两次或者被导入 java.lang 的类中。 JUnit 测试(rulesets/junit.xml)—— 查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及 suite() 方法是不是 static 和 public。 字符串(rulesets/string.xml)—— 找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用 String 构造函数,对 String 变量调用 toString() 方法。 括号(rulesets/braces.xml)—— 检查 for、 if、 while 和 else 语句是否使用了括号。 代码尺寸(rulesets/codesize.xml)—— 测试过长的方法、有太多方法的类以及重构方面的类似问题。 Javabean(rulesets/javabeans.xml)—— 查看 JavaBean 组件是否违反 JavaBean 编码规范,比如没有序列化的 bean 类。 终结函数(finalizer)—— 因为在 Java 语言中, finalize() 方法不是那么普遍(我上次编写这个代码也经是好多年前的事了),所以它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找 finalize() 方法的各种问题,例如空的终结函数,调用其他方法的 finalize() 方法,对 finalize() 的显式调用,等等。 克隆(rulesets/clone.xml)—— 用于 clone() 方法的新规则。凡是重写 clone() 方法的类都必须实现 Cloneable, clone() 方法应该调用 super.clone(),而 clone() 方法应该声明抛出 CloneNotSupportedException 异常,即使实际上没有抛出异常,也要如此。 耦合(rulesets/coupling.xml)—— 查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。 严格的异常(rulesets/strictexception.xml)—— 针对异常的测试:不应该声明该方法而抛出 java.lang.Exception 异常,不应当将异常用于流控制,不应该捕获 Throwable,等等。 有争议的(rulesets/controversial.xml)—— PMD 的有些规则是有能力的 Java 程序员可以接受的。但还是有一些争议。这个规则集包含一些更有问题的检验,其中包括把 null 赋值给变量、方法中有多个返回点,以及从 sun 包导入等。 日志(rulesets/logging-java.xml)—— 查找 java.util.logging.Logger 的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。
2、构建自己的规则集
2.1、导入规则集
<?xml version="1.0"?> <ruleset name="customruleset"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml"/> <rule ref="rulesets/naming.xml"/> <rule ref="rulesets/basic.xml"/> </ruleset>文件保存成为*.xml,通过Rules Configuration 的Import 导入到PMD中2.2、导入特定规则的规则集
<?xml version="1.0"?>
<ruleset name="specific rules">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml/AvoidReassigningParametersRule"/>
<rule ref=
"rulesets/design.xml/ConstructorCallsOverridableMethod"/>
<rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/>
<rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/>
<rule ref="rulesets/naming.xml/LongVariable"/>
<rule ref="rulesets/naming.xml/ShortMethodName"/>
<rule ref="rulesets/naming.xml/VariableNamingConventions"/>
<rule ref="rulesets/naming.xml/MethodNamingConventions"/>
<rule ref="rulesets/naming.xml/ClassNamingConventions"/>
<rule ref="rulesets/basic.xml/EmptyCatchBlock"/>
<rule ref="rulesets/basic.xml/EmptyFinallyBlock"/>
</ruleset>
文件保存成为*.xml,通过Rules Configuration 的Import 导入到PMD中
2.3、排除了设计规则的规则集
可以把大多数规则包含在一个集合,但是不包括少数您不同意的或者会造成大量误报的特定规则。例如,XOM 在进行表查找的时候经常使用没有 default 块的 switch 语句。我可以保留大多数设计规则,但是可以在导入设计规则的规则元素中添加 <exclude name="SwitchStmtsShouldHaveDefault"/> 子元素,避开对遗漏 default 块的检查
<?xml version="1.0"?>
<ruleset name="dW rules">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml">
<exclude name="SwitchStmtsShouldHaveDefault"/>
</rule>
</ruleset>
2.4、通过编写XPath表达式实现规则集
编写 XPath 表达式,它会针对每个 Java 类的抽象语法树进行处理,但是比较繁杂......
分享到:
相关推荐
- **集成开发环境(IDE)插件**:PMD可以集成到Eclipse、IntelliJ IDEA等主流IDE中,实现实时代码检查。 - **构建工具集成**:可以将PMD与Maven、Gradle等构建工具结合,让代码检查成为构建过程的一部分。 5. ...
- **插件集成**:可以在Eclipse等IDE中集成CheckStyle插件,以便实时查看分析结果。 ##### 3. 使用场景 - **代码风格统一**:确保团队成员遵守一致的代码风格,提升代码的可读性和可维护性。 - **自动化构建**:将...
一、Eclipse 插件概述 Eclipse 插件是基于 Eclipse 平台的可扩展模块,它们可以增强 Eclipse 的功能,满足特定的开发需求。Eclipse 插件体系基于 OSGi 模块系统,允许开发者轻松地添加或移除功能,创建高度定制化的...
Eclipse的插件生态系统是其一大亮点,通过Marketplace可以找到并安装各种扩展,例如Mylyn用于任务管理,PMD进行代码质量检查,SonarQube集成代码质量管理。 8. **学习与进阶**: 对于初学者,Eclipse提供了丰富的...
1. **Eclipse概述**: Eclipse是一个可扩展的平台,最初由IBM公司开发,现在由Eclipse基金会管理。它不仅仅是一个IDE,更是一个插件框架,允许开发者通过安装不同的插件来支持多种编程语言和开发任务,如C/C++、...
9. **Eclipse插件**:Eclipse的插件如Checkstyle和PMD可以帮助开发者检测不符合规范的代码,并提供修复建议。 10. **版本控制**:当多人协作时,遵循一致的代码规范有助于代码审查和合并。Eclipse与Git等版本控制...
- **概述**:M2eclipse 是一款将Maven集成到Eclipse的插件。 - **特点**: - 自动导入Maven项目到Eclipse工作空间。 - 提供Maven生命周期的可视化管理。 - 支持依赖冲突检测和解决。 #### 13. Subclipse - **...
1. **Eclipse IDE概述**: Eclipse作为一个开放源代码的平台,不仅限于Java,还支持C++, Python, PHP等多种编程语言。其强大的插件系统使得开发者可以根据需求扩展其功能,例如添加对特定框架或语言的支持。 2. **...
1. **Eclipse Java的概述** Eclipse Java是Eclipse IDE的一个重要分支,专注于Java开发。它提供了一整套工具,包括代码编辑器、调试器、构建工具以及对Java应用程序的全面支持。此外,Eclipse Java还允许用户通过...
#### 一、概述 在软件开发过程中,为了提高开发效率与团队协作能力,统一开发环境及工具是非常必要的。本篇文章基于Eclipse 3.5版本,详细介绍了如何针对Koolearn项目的特定需求,对Eclipse进行定制化的配置。以下...
1. **Eclipse IDE概述**:Eclipse起源于IBM公司,后来成为了一个开放源码项目。它以插件为基础的架构允许用户根据需求扩展其功能,如安装Java开发工具(JDT)、Web开发工具(WTP)等。Eclipse不仅限于编程,还广泛...
### IDEA集成阿里巴巴JAVA开发规范插件使用手册 #### 概述 随着软件开发技术的不断发展,为了提升代码质量、统一编码风格以及减少潜在错误,《阿里巴巴Java开发规约》成为了一个广受欢迎的规范标准。该规约不仅包含...
MyEclipse是一款非常流行的Java集成开发环境(IDE),它基于Eclipse平台构建,提供了丰富的插件和功能增强,非常适合进行Java EE应用的开发。MyEclipse 6.01 Professional作为一款专业版本,相较于标准版或社区版拥有...
1. **插件扩展**:MyEclipse基于Eclipse,因此可以利用Eclipse MarketPlace安装额外的插件,扩展其功能,如PMD用于代码质量检查,FindBugs用于找寻潜在的编程错误。 2. **快捷键操作**:熟练掌握MyEclipse的快捷键...
- **灵活的集成方式**:Sonar可以作为Web客户端或者Eclipse插件使用,并且能够与其他代码分析工具(如FindBugs、PMD等)集成,提高代码分析的全面性。 - **丰富的插件生态**:Sonar拥有一个强大的插件生态系统,支持...
- **集成能力**:Gradle 可以很好地与其他工具(如 Eclipse、IntelliJ IDEA)集成。 **1.3 安装配置** - **下载安装**:访问 Gradle 官网下载最新版本的 Gradle 并解压至指定目录。 - **环境变量配置**:将 Gradle...
在IDE如IntelliJ IDEA或Eclipse中,选择“New > Maven Project”,然后不勾选“Create Artifact ID”和“Create module group ID”,只输入Group ID(通常是公司域名倒置,如com.example),Artifact ID(父项目名,...