上周客户要求对OA系统的代码质量进行了一个整体审查,并且要出一份报告给领导。
为此花了半天时间把代码审查工具PMD琢磨了下,现将具体操作步骤描述如下,以供大家参考!
1 前言
质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤其是企业应用软件系统来说,除了软件运行质量、文档质量以外,代码的质量也是非常重要的。软件开发进行到编码阶段的时候,最大的风险就在于如何保证代码的易读性和一致性,从而使得软件的维护的代价不会很高。
2 PMD简介
PMD是一种分析Java代码错误的开源工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:
- 潜在的bug:确保资源(像连接、声明和记录集) 在使用后总是关闭
- 未使用的代码:未使用的局部变量、参数、私有方法等
- 可选的代码:String/StringBuffer的滥用
- 复杂的表达式:不必须的if语句,可用while循环完成的for循环
- 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
- 不优化的代码:避免在循环语句中初始化新对象(new变量)
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。
3 环境准备
1、首先需要下载ant-1.8.2及pmd-bin-4.2.1两个资源;
2、ant环境变量配置:
4 修改build.xml文件
目录:[../pmd-bin-4.2.1/pmd-4.2.1]
其中运行完生成的(E:\Tool\PMD\imis_oa.html)文件便是审查结果报告!
5 替换favorites.xml文件内容
目录:[../pmd-bin-4.2.1/pmd-4.2.1/rulesets]
1 <?xml version="1.0"?> 2 3 <ruleset name="Favorites" 4 xmlns="http://pmd.sf.net/ruleset/1.0.0" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" 7 xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> 8 9 <description> 10 The Favorites ruleset contains links to rules that I like to use. Usually I 11 combine this ruleset with the unusedcode.xml, basic.xml, and import.xml rulesets for my projects. 12 This ruleset also serves as an example of how to do a custom ruleset. 13 </description> 14 <rule ref="rulesets/basic.xml"/> 15 <rule ref="rulesets/unusedcode.xml"/> 16 <rule ref="rulesets/braces.xml/IfStmtsMustUseBraces"/> 17 <rule ref="rulesets/braces.xml/WhileLoopsMustUseBraces"/> 18 <rule ref="rulesets/braces.xml/IfElseStmtsMustUseBraces"/> 19 <rule ref="rulesets/braces.xml/ForLoopsMustUseBraces"/> 20 <rule ref="rulesets/design.xml/CloseResource"/> 21 <rule ref="rulesets/design.xml/NonStaticInitializer"/> 22 <rule ref="rulesets/design.xml/NonCaseLabelInSwitchStatement"/> 23 <rule ref="rulesets/design.xml/OptimizableToArrayCall"/> 24 <rule ref="rulesets/design.xml/EqualsNull"/> 25 <rule ref="rulesets/design.xml/AbstractClassWithoutAbstractMethod"/> 26 <rule ref="rulesets/design.xml/UnnecessaryLocalBeforeReturn"/> 27 <rule ref="rulesets/design.xml/UncommentedEmptyMethod"/> 28 <rule ref="rulesets/design.xml/UseCollectionIsEmpty"/> 29 <rule ref="rulesets/design.xml/ClassWithOnlyPrivateConstructorsShouldBeFinal"/> 30 <rule ref="rulesets/design.xml/EmptyMethodInAbstractClassShouldBeAbstract"/> 31 <rule ref="rulesets/design.xml/ReturnEmptyArrayRatherThanNull"/> 32 <rule ref="rulesets/design.xml/AbstractClassWithoutAnyMethod"/> 33 <rule ref="rulesets/basic.xml/EmptyCatchBlock"/> 34 <rule ref="rulesets/basic.xml/EmptyIfStmt"/> 35 <rule ref="rulesets/basic.xml/EmptyWhileStmt"/> 36 <rule ref="rulesets/basic.xml/EmptyTryBlock"/> 37 <rule ref="rulesets/basic.xml/EmptyFinallyBlock"/> 38 <rule ref="rulesets/basic.xml/EmptySwitchStatements"/> 39 <rule ref="rulesets/basic.xml/EmptyStatementNotInLoop"/> 40 <rule ref="rulesets/basic.xml/BooleanInstantiation"/> 41 <rule ref="rulesets/basic.xml/UnnecessaryFinalModifier"/> 42 <rule ref="rulesets/strings.xml/StringToString"/> 43 <rule ref="rulesets/strings.xml/StringInstantiation"/> 44 <rule ref="rulesets/controversial.xml/UnnecessaryConstructor"/> 45 <rule ref="rulesets/controversial.xml/NullAssignment"/> 46 <rule ref="rulesets/controversial.xml/UnusedModifier"/> 47 48 49 </ruleset>
经本人多次尝试不替换会报以下错误:
6 运行[执行检查.bat]程序
若以上步骤都成功完成,你想要的代码审查报告也已生成!呈现形式如下: