代码检查工具系列——CheckStyle

来源:互联网 发布:网页游戏破解软件 编辑:程序博客网 时间:2024/04/29 07:03

前言

  大家都知道有很多公司拥有外包团队,而外包团队当任务完成后,很多不会再与公司有业务关联,在项目验收时就要验收代码,那么如何面对大量的代码,人工去看完所有代码是一项非常庞大的工作,这时我们就需要好用的代码检查工具了。本篇博客将主要讲述CheckStyle,看完本篇博客可以让你知道和基本掌握CheckStyle的使用。

CheckStyle

  CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。

CheckStyle安装

  因为项目是用Eclipse的,所以这里简单说一下CheckStyle在Eclipse下的安装过程。其他的可在CheckStyle官网去看。
  为了方便大家使用,大家可以点击这里下载离线安装包。然后将该包解压出来之后,将features和 plugins文件夹下的的文件复制到Eclipse下对应的文件夹下,重启Eclipse即可。
  点击Windows—>Peferences,看到如下图,则表明安装成功。
  这里写图片描述

CheckStyle使用

  CheckStyle既可以检查单个文件,也可以检查整个项目。使用方式很简单,选中文件或工程右键—>CheckStyle—>Check Code With CheckStyle,如下图:
  这里写图片描述
  

CheckStyle规则简介

Windows–>Perference–>CheckStyle 弹出如下菜单:
这里写图片描述
可以看出CheckStyle默认提供了三种规则配置文件:
这里写图片描述
同时我们也可以自己导入自己的规则配置文件。
通过点击对话框右上方的new导入我们自己的规则配置文件,选择外部配置文件,输入name,并导入相应的xml文件即可。
这里写图片描述
同时也可以如下图所示对已导入的配置文件提供的检测项进行使用或忽略。打勾表示使用,不打勾则忽略。
这里写图片描述
这里简单举例说明一下CheckStyle里面的配置文件,如下所示,已注说明。

<?xml version="1.0"?><!DOCTYPE module PUBLIC          "-//Puppy Crawl//DTD Check Configuration 1.2//EN"          "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"><module name="Checker">         <property name="severity" value="warning"/>    <module name="StrictDuplicateCode">        <property name="charset" value="utf-8" />       </module>       <module name="TreeWalker">           <!-- javadoc的检查 -->           <!-- 检查所有的interface和class -->           <module name="JavadocType" />           <!-- 命名方面的检查 -->           <!-- 局部的final变量,包括catch中的参数的检查 -->           <module name="LocalFinalVariableName" />           <!-- 局部的非final型的变量,包括catch中的参数的检查 -->           <module name="LocalVariableName" />           <!-- 包名的检查(只允许小写字母) -->           <module name="PackageName">               <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />           </module>           <!-- 仅仅是static型的变量(不包括static final型)的检查 -->           <module name="StaticVariableName" />           <!-- 类型(Class或Interface)名的检查 -->           <module name="TypeName" />           <!-- 非static型变量的检查 -->           <module name="MemberName" />           <!-- 方法名的检查 -->           <module name="MethodName" />           <!-- 方法的参数名 -->           <module name="ParameterName " />           <!-- 常量名的检查 -->           <module name="ConstantName" />        <!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 -->           <module name="UnusedImports" />           <!-- 长度方面的检查 -->           <!-- 文件长度不超过1500行 -->           <module name="FileLength">               <property name="max" value="1500" />           </module>           <!-- 每行不超过150个字-->           <module name="LineLength">               <property name="max" value="150" />           </module>           <!-- 方法不超过150行 -->           <module name="MethodLength">               <property name="tokens" value="METHOD_DEF" />               <property name="max" value="150" />           </module>           <!-- 方法的参数个数不超过5个。 并且不对构造方法进行检查-->           <module name="ParameterNumber">               <property name="max" value="5" />               <property name="tokens" value="METHOD_DEF" />           </module>           <!-- 空格检查 -->           <!-- 允许方法名后紧跟左边圆括号"(" -->           <module name="MethodParamPad" />           <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->           <module name="TypecastParenPad" />        <!-- 关键字 -->           <!--               每个关键字都有正确的出现顺序。比如 public static final XXX 是对一个常量的声明。如果使用 static             public final 就是错误的           -->           <module name="ModifierOrder" />           <!-- 多余的关键字 -->           <module name="RedundantModifier" />           <!-- 对区域的检查 -->           <!-- 不能出现空白区域 -->           <module name="EmptyBlock" />           <!-- 所有区域都要使用大括号 -->           <module name="NeedBraces" />        <!-- 多余的括号 -->           <module name="AvoidNestedBlocks">               <property name="allowInSwitchCase" value="true" />           </module>           <!-- 编码方面的检查 -->           <!-- 不许出现空语句 -->           <module name="EmptyStatement" />         <!-- 不允许魔法数 -->           <module name="MagicNumber">               <property name="tokens" value="NUM_DOUBLE, NUM_INT" />           </module>        <!-- 多余的throw -->           <module name="RedundantThrows" />         <!-- String的比较不能用!= 和 == -->           <module name="StringLiteralEquality" />           <!-- if最多嵌套3层 -->           <module name="NestedIfDepth">               <property name="max" value="3" />           </module>           <!-- try最多被嵌套2层 -->           <module name="NestedTryDepth">               <property name="max" value="2" />           </module>           <!-- clone方法必须调用了super.clone() -->           <module name="SuperClone" />           <!-- finalize 必须调用了super.finalize() -->           <module name="SuperFinalize" />           <!-- 不能catch java.lang.Exception -->           <module name="IllegalCatch">               <property name="illegalClassNames" value="java.lang.Exception" />          </module>           <!-- 确保一个类有package声明 -->           <module name="PackageDeclaration" />           <!-- 一个方法中最多有3个return -->           <module name="ReturnCount">               <property name="max" value="3" />               <property name="format" value="^$" />           </module>           <!--               根据 Sun 编码规范, class 或 interface 中的顺序如下: 1.class 声明。首先是 public,               然后是protected , 然后是 package level (不包括access modifier ) 最后是private .               (多个class放在一个java文件中的情况) 2.变量声明。 首先是 public, 然后是protected然后是 package             level (不包括access modifier ) 最后是private . (多个class放在一个java文件中的情况)               3.构造函数 4.方法           -->           <module name="DeclarationOrder" />         <!-- 同一行不能有多个声明 -->           <module name="MultipleVariableDeclarations" />           <!-- 不必要的圆括号 -->           <module name="UnnecessaryParentheses" />            <!-- 杂项 -->           <!-- 禁止使用System.out.println -->           <module name="GenericIllegalRegexp">               <property name="format" value="System\.out\.println" />               <property name="ignoreComments" value="true" />        </module>        <!-- 检查并确保所有的常量中的L都是大写的。因为小写的字母l跟数字1太象了 -->           <module name="UpperEll" />           <!-- 检查数组类型的定义是String[] args,而不是String args[] -->           <module name="ArrayTypeStyle" />        <!-- 检查java代码的缩进 默认配置:基本缩进 4个空格,新行的大括号:0。新行的case 4个空格 -->           <module name="Indentation" />       </module> </module>        

查看CheckStyle检查的结果

通过在指定的项目或指定的java类上右键—>CheckStyle—>Check Code With CheckStyle
可以看到下图:
这里写图片描述
ps:看不到该图的可以通过windows–>showview–>other–>checkstyle–>checkstyle violations chart 显示改图
点击图中不同颜色的区块,可以跳转到该区块对应的说明:
这里写图片描述
双击任一行,便可以跳转到具体的java文件中被检测到的行,然后依据规则进行修改。
这里写图片描述
  

总结

通过学习本篇博文,大家可以基本学会使用CheckStyle工具,但是要熟练的运用该工具为自己的项目服务,还需要仔细了解CheckStyle的规则,手动配置自己需要的检测项,本篇博客不再进行讲解。

2 0
原创粉丝点击