CheckStyle使用手册(一)
介绍
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从 而使得开发人员从这项重要,但是枯燥的任务中解脱出来。
CheckStyle默认提供一下主要检查内容:
•Javadoc注释
•命名约定
•标题
•Import语句
•体积大小
•空白
•修饰符
•块
•代码问题
•类设计
•混合检查(包活一些有用的比如非必须的 System.out和printstackTrace)
从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范 的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。
Eclipse插件安装和使用
步骤一:http://sourceforge.net/projects/checkclipse/下载checkstyle的eclipse插件checkclipse。下载后,将包放入eclipse的plugins文件夹下,然后重启eclipse。在Windows—>preferences下找到checkclipse。如下图:
勾选Set Project Dir as Checkjstyle Basedir
步骤二:右键选中你要进行checkstyle的项目文件,选择“properties”。如下图:
勾选Enable Checkstyle和Set Project ClassLoader.
然后再Checkstyle Configuraion File中选择项目中checkstyle的配置文件。这里我把配置文件时放置在项目根目录下,所以点击右侧“Browse”按钮,在项目根目录下选择该文件。按“OK”按钮。
这样整个项目的代码将根据配置文件中设置的原则进行出错提示.结果如下图:
由图可知对不符合代码规范的代码会有错误提示,并且有提示信息。
Maven插件安装和使用
首先,修改要检查代码库top级的pom.xml文件,在build部分配置CheckStyle的Maven插件,以便于下载安装对应版本的插件(Maven会自动从其镜像库中下载),方法如下:
- <project>
- ...
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <version>2.3</version>
- </plugin>
- </plugins>
- </build>
- ...
- </project>
maven-checkstyle-plugin的最新版本为2.5,其对应的CheckStyle核心版本为5.0;maven-checkstyle-plugin 2.3对应的CheckStyle核心版本为4.4。查看插件的pom文件,可看到如下内容,其中的版本号就为对应的CheckStyle的版本号。
- <dependency>
- <groupId>checkstyle</groupId>
- <artifactId>checkstyle</artifactId>
- <version>4.4</version>
- </dependency>
接下来,将自定义的规则配置文件拷贝到top级目录,在reporting部分的CheckStyle插件配置中引用配置。
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <configLocation>my_checks.xml</configLocation>
- </configuration>
- </plugin>
- </plugins>
- </reporting>
也可以将配置文件放在子文件夹下,配置中带上相对路径即可。
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <configLocation>build-tools/src/main/resources/xx/my_checks.xml</configLocation>
- </configuration>
- </plugin>
- </plugins>
- </reporting>
如果使用插件自带的规则文件,可以作如下配置。maven-checkstyle-plugin插件自带的规则有sun_checks.xml、maven_checks.xml等,可查看插件包。
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <configLocation>config/maven_checks.xml</configLocation>
- </configuration>
- <version>2.3</version>
- </plugin>
- </plugins>
- </reporting>
在reporting部分增加jxr插件,生成代码报告,这样在CheckStyle报告 中点击问题对应的链接就可以直接看到出错的代码。
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <configLocation>my_checks.xml</configLocation>
- </configuration>
- <version>2.3</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jxr-plugin</artifactId>
- </plugin>
- </plugins>
- </reporting>
在build和reporting部分增加javadoc插件,如果pom文件中已经配置,则只需作相应修改。charset、encoding、docencoding配置用于解决生成的javadoc文件中文乱码问题;aggregate配置为true则javadoc报告会集中显示所有子模块的javadoc。
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <aggregate>true</aggregate>
- <charset>UTF-8</charset>
- <encoding>UTF-8</encoding>
- <docencoding>UTF-8</docencoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <configLocation>my_checks.xml</configLocation>
- </configuration>
- <version>2.3</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jxr-plugin</artifactId>
- </plugin>
- </plugins>
- </reporting>
在maven插件中使用 install命令将pom文件中配置的插件下载安装到本地,然后使用checkstyle:checkstyle命令进行检查并生成报告,运行完毕,各项目目录下会生成target目录,target\site\checkstyle.html即为该项目的问题报告。
需要注意的是checkstyle:checkstyle仅生成CheckStyle相关报告,因此不能从报告中直接链接到错误代码;需要同时生成jxr源代码,使用site。
如果运行checkstyle:checkstyle或site过程中出现如下错误,则应该修改CheckStyle规 则配置文件,去除其中的中文字符。
- “[ERROR] BUILD ERROR
- [INFO] ------------------------------------------------------------------------
- [INFO] An error has occurred in Checkstyle report generation.
- Embedded error: Failed during checkstyle configuration
- Invalid byte 1 of 1-byte UTF-8 sequence.
- ”
最佳实践
自定义的checkstyle配置文件
以下代码是自定义的checkstyle配置文件内容,相关说明都已经用注释形式写在文件中。代码如下:
- <!DOCTYPE module PUBLIC
- "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
- "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
- <module name="Checker">
- <!--
- 重复代码的检查,超过8行就认为重复,UTF-8格式 本检查一定要放在"TreeWalker"节点前,否则在
- Checkclipse中会无法使用。(在ant下可以)
- -->
- <module name="StrictDuplicateCode">
- <property name="min" value="8" />
- <property name="charset" value="UTF-8" />
- </module>
- <module name="TreeWalker">
- <!-- javadoc的检查 -->
- <!-- 检查所有的interface和class -->
- <module name="JavadocType" />
- <!-- 命名方面的检查,它们都使用了Sun官方定的规则。 -->
- <!-- 局部的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方面的检查 -->
- <!-- import中避免星号"*" -->
- <module name="AvoidStarImport" />
- <!--
- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import
- 与该类在同一个package的
- -->
- <module name="UnusedImports" />
- <!-- 长度方面的检查 -->
- <!-- 文件长度不超过1500行 -->
- <module name="FileLength">
- <property name="max" value="1500" />
- </module>
- <!-- 每行不超过120个字-->
- <module name="LineLength">
- <property name="max" value="120" />
- </module>
- <!-- 方法不超过30行 -->
- <module name="MethodLength">
- <property name="tokens" value="METHOD_DEF" />
- <property name="max" value="30" />
- </module>
- <!-- 方法的参数个数不超过3个。 并且不对构造方法进行检查-->
- <module name="ParameterNumber">
- <property name="max" value="3" />
- <property name="tokens" value="METHOD_DEF" />
- </module>
- <!-- 空格检查 -->
- <!-- 允许方法名后紧跟左边圆括号"(" -->
- <module name="MethodParamPad" />
- <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
- <module name="TypecastParenPad" />
- <!-- 不允许使用"tab"键 -->
- <module name="TabCharacter" />
- <!-- 关键字 -->
- <!--
- 每个关键字都有正确的出现顺序。比如 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" />
- <!-- 每个类都实现了equals()和hashCode() -->
- <module name="EqualsHashCode" />
- <!-- 不许使用switch,"a++"这样可读性很差的代码 -->
- <module name="IllegalToken" />
- <!-- 不许内部赋值 -->
- <module name="InnerAssignment" />
- <!-- 绝对不能容忍魔法数 -->
- <module name="MagicNumber">
- <property name="tokens" value="NUM_DOUBLE, NUM_INT" />
- </module>
- <!-- 循环控制变量不能被修改 -->
- <module name="ModifiedControlVariable" />
- <!-- 多余的throw -->
- <module name="RedundantThrows" />
- <!-- 不许使用未被简化的条件表达式 -->
- <module name="SimplifyBooleanExpression" />
- <!-- 不许使用未被简化的布尔返回值 -->
- <module name="SimplifyBooleanReturn" />
- <!-- 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="ParameterAssignment" />
- <!-- 确保某个class 在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean 变量是false.) -->
- <module name="ExplicitInitialization" />
- <!-- 不许有同样内容的String -->
- <module name="MultipleStringLiterals" />
- <!-- 同一行不能有多个声明 -->
- <module name="MultipleVariableDeclarations" />
- <!-- 不必要的圆括号 -->
- <module name="UnnecessaryParentheses" />
- <!-- 各种量度 -->
- <!-- 布尔表达式的复杂度,不超过3 -->
- <module name="BooleanExpressionComplexity" />
- <!-- 类数据的抽象耦合,不超过7 -->
- <module name="ClassDataAbstractionCoupling" />
- <!-- 类的分散复杂度,不超过20 -->
- <module name="ClassFanOutComplexity" />
- <!-- 函数的分支复杂度,不超过10 -->
- <module name="CyclomaticComplexity" />
- <!-- NPath复杂度,不超过200 -->
- <module name="NPathComplexity" />
- <!-- 杂项 -->
- <!-- 禁止使用System.out.println -->
- <module name="GenericIllegalRegexp">
- <property name="format" value="System\.out\.println" />
- <property name="ignoreComments" value="true" />
- </module>
- <!-- 不许使用main方法 -->
- <module name="UncommentedMain" />
- <!-- 检查并确保所有的常量中的L都是大写的。因为小写的字母l跟数字1太象了 -->
- <module name="UpperEll" />
- <!-- 检查数组类型的定义是String[] args,而不是String args[] -->
- <module name="ArrayTypeStyle" />
- <!--
- 检查java代码的缩进 默认配置:基本缩进 4个空格,新行的大括号:0。新行的case 4个空格。
- -->
- <module name="Indentation" />
- </module>
- <!-- 检查翻译文件 -->
- <module name="Translation" />
- </module>
CheckStyle应用的最佳实践
采用CheckStyle以后,编码规范的检查就变得及其简单,可以作为一项切实可行的实践加以执行。
一般情况下,在项目小组中引入CheckStyle可以按照下面的步骤进行:
1. 强调Code Review与Code Conventions的重要作用;
2. 介绍CheckStyle;
3. 初步应用CheckStyle:参照CheckStyle附带的配置文件,酌情加以剪裁,在项目的Maven配置文件中,添加CheckStyle任务,可以 单独执行;
4. 修改、定型CheckStyle的配置文件:按照基本配置文件执行一段时间(2~3周),听取开发人员的反馈意见,修改配置信息;
5. 作为开发过程的日常实践,强制执行CheckStyle:稳定CheckStyle的配置信息,同时将CheckStyle任务作为Build的依赖任务 或者配置SCM(目前,CheckStyle可以与SVN有效集成),使得代码在加入系统 之前必须通过检查。
同时需要指出的是,CheckStyle的有效执行需要依赖的条件:
•IDE Format Code的强大功能:由于CheckStyle本身并没有提供很强大的Code Format等功能,因此,需要借助IDE的帮助,从而使得在发生错误的时候,可以很容易的进行修复。
IDE格式配置使用介绍
在eclipse中的windowpreferencesjavacode style中可以导入自定义的java编码风格文件。如下图:
点击“Clean Up”,在右侧可以看见一个Import按钮,导入自定义的cleanup文件,点击“OK”即可。左侧的“Formatter”也是如法炮制。具体自定义的checkstyle,cleanup,formatter文件可参考压缩包文件中的公司代码规范文件夹。
CheckStyle使用手册(一)的更多相关文章
- checkStyle使用手册
1. Annotations(注解:5个) Annotation Use Style(注解使用风格) 这项检查可以控制要使用的注解的样式. Missing Deprecated(缺少deprecad) ...
- 《阿里巴巴Java开发手册》代码格式部分应用——idea中checkstyle的使用教程
<阿里巴巴Java开发手册>代码格式部分应用--idea中checkstyle的使用教程 1.<阿里巴巴Java开发手册> 这是阿里巴巴工程师送给各位软件工程师的宝典,就像开车 ...
- JAVA静态代码审查之checkstyle
技术总监来巡查,刚巧前段时间遇到了一个问题还没解决,就拉着大牛开问.结果,问题是解决了,还附带了另一个问题,或是要求出来,没啥技术含量,但是很麻烦的一个东西:代码格式. 之前我写代码,因为屏幕比较小, ...
- 阿里巴巴Java开发手册评述
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- 阿里巴巴Java开发手册评
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- 阿里巴巴 Java 开发手册评述
http://blog.jobbole.com/110427 阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGi ...
- findbug、p3c、checkstyle、sonar安装使用
idea插件安装方式: Preferences—>Plugins—>查找插件—>Install Preferences—>Plugins—>Install plug fr ...
- FREERTOS 手册阅读笔记
郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized ...
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
随机推荐
- 查收新年礼物丨DevEco Studio 3.0 Beta2发布,20个新变化详解
HUAWEI DevEco Studio是开发HarmonyOS应用和原子化服务的一站式集成开发环境(IDE),为开发者提供工程模板创建.开发.编译.调试.发布等功能. 2021年12月31日,新版本 ...
- MATLAB 不同维度矩阵加减乘除
>> A=[1,2,3;4,5,6;7,8,9],B=[1,2;3,4] A = 1 2 3 4 5 6 7 8 9 B = 1 2 3 4 >> [rA,cA]=size(A ...
- 基于GO语言实现的固定长度邀请码
1. 选取数字加英文字母组成32个字符的字符串,用于表示32进制数. 2. 用一个特定的字符比如`G`作为分隔符,解析的时候字符`G`后面的字符不参与运算. 3. LEN表示邀请码长度,默认为6. g ...
- Microsoft HoloLens 开发(3): 全息图交互方式 - Gaze
Gaze(凝视) 是 HoloLens 交互输入的第一种形式,告诉你 用户 在世界上的位置,并让你确定他们的意图. 1.Gaze的用途 作为一个 Mixed Reality 开发者,Gaze 可以做很 ...
- centos7 常规修改信息(比较杂的)持续更新
修改主机名 临时修改主机名 hostname syscal 永久修改主机名,修改后要重启系统 vi /etc/hostname 修改本地hosts 修改本地hosts,与windows的本地的host ...
- Python常用功能函数系列总结(六)
本节目录 常用函数一:词云图 常用函数二:关键词清洗 常用函数三:中英文姓名转换 常用函数四:去除文本中的HTML标签和文本清洗 常用函数一:词云图 wordcloud # -*- coding: ...
- NOSQL数据库之MongoDB
一.NoSQL概述 如今,大多数的计算机系统(包括服务器.PC.移动设备等)都会产生庞大的数据量.其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,).这些数据有很大一部 ...
- [转]浮点运算decimal.js
开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双精度浮 ...
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...
- Cesium入门4 - 创建Cesium Viewer
Cesium入门4 - 创建Cesium Viewer Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 任何Ce ...