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会自动从其镜像库中下载),方法如下:

Java代码  

  1. <project>
  2. ...
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-checkstyle-plugin</artifactId>
  8. <version>2.3</version>
  9. </plugin>
  10. </plugins>
  11. </build>
  12. ...
  13. </project>

maven-checkstyle-plugin的最新版本为2.5,其对应的CheckStyle核心版本为5.0;maven-checkstyle-plugin 2.3对应的CheckStyle核心版本为4.4。查看插件的pom文件,可看到如下内容,其中的版本号就为对应的CheckStyle的版本号。

Java代码  

  1. <dependency>
  2. <groupId>checkstyle</groupId>
  3. <artifactId>checkstyle</artifactId>
  4. <version>4.4</version>
  5. </dependency>

接下来,将自定义的规则配置文件拷贝到top级目录,在reporting部分的CheckStyle插件配置中引用配置。

Java代码  

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-checkstyle-plugin</artifactId>
  6. <configuration>
  7. <configLocation>my_checks.xml</configLocation>
  8. </configuration>
  9. </plugin>
  10. </plugins>
  11. </reporting>

也可以将配置文件放在子文件夹下,配置中带上相对路径即可。

Java代码  

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-checkstyle-plugin</artifactId>
  6. <configuration>
  7. <configLocation>build-tools/src/main/resources/xx/my_checks.xml</configLocation>
  8. </configuration>
  9. </plugin>
  10. </plugins>
  11. </reporting>

如果使用插件自带的规则文件,可以作如下配置。maven-checkstyle-plugin插件自带的规则有sun_checks.xml、maven_checks.xml等,可查看插件包。

Java代码  

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-checkstyle-plugin</artifactId>
  6. <configuration>
  7. <configLocation>config/maven_checks.xml</configLocation>
  8. </configuration>
  9. <version>2.3</version>
  10. </plugin>
  11. </plugins>
  12. </reporting>

在reporting部分增加jxr插件,生成代码报告,这样在CheckStyle报告 中点击问题对应的链接就可以直接看到出错的代码。

Java代码  

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-checkstyle-plugin</artifactId>
  6. <configuration>
  7. <configLocation>my_checks.xml</configLocation>
  8. </configuration>
  9. <version>2.3</version>
  10. </plugin>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-jxr-plugin</artifactId>
  14. </plugin>
  15. </plugins>
  16. </reporting>

在build和reporting部分增加javadoc插件,如果pom文件中已经配置,则只需作相应修改。charset、encoding、docencoding配置用于解决生成的javadoc文件中文乱码问题;aggregate配置为true则javadoc报告会集中显示所有子模块的javadoc。

Java代码  

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-javadoc-plugin</artifactId>
  6. <version>2.4</version>
  7. <configuration>
  8. <aggregate>true</aggregate>
  9. <charset>UTF-8</charset>
  10. <encoding>UTF-8</encoding>
  11. <docencoding>UTF-8</docencoding>
  12. </configuration>
  13. </plugin>
  14. <plugin>
  15. <groupId>org.apache.maven.plugins</groupId>
  16. <artifactId>maven-checkstyle-plugin</artifactId>
  17. <configuration>
  18. <configLocation>my_checks.xml</configLocation>
  19. </configuration>
  20. <version>2.3</version>
  21. </plugin>
  22. <plugin>
  23. <groupId>org.apache.maven.plugins</groupId>
  24. <artifactId>maven-jxr-plugin</artifactId>
  25. </plugin>
  26. </plugins>
  27. </reporting>

在maven插件中使用 install命令将pom文件中配置的插件下载安装到本地,然后使用checkstyle:checkstyle命令进行检查并生成报告,运行完毕,各项目目录下会生成target目录,target\site\checkstyle.html即为该项目的问题报告。 
需要注意的是checkstyle:checkstyle仅生成CheckStyle相关报告,因此不能从报告中直接链接到错误代码;需要同时生成jxr源代码,使用site。 
如果运行checkstyle:checkstyle或site过程中出现如下错误,则应该修改CheckStyle规 则配置文件,去除其中的中文字符。

Java代码  

  1. “[ERROR] BUILD ERROR
  2. [INFO] ------------------------------------------------------------------------
  3. [INFO] An error has occurred in Checkstyle report generation.
  4. Embedded error: Failed during checkstyle configuration
  5. Invalid byte 1 of 1-byte UTF-8 sequence.

最佳实践 
自定义的checkstyle配置文件 
  以下代码是自定义的checkstyle配置文件内容,相关说明都已经用注释形式写在文件中。代码如下:

Java代码  

  1. <!DOCTYPE module PUBLIC
  2. "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
  3. "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
  4. <module name="Checker">
  5. <!--
  6. 重复代码的检查,超过8行就认为重复,UTF-8格式 本检查一定要放在"TreeWalker"节点前,否则在
  7. Checkclipse中会无法使用。(在ant下可以)
  8. -->
  9. <module name="StrictDuplicateCode">
  10. <property name="min" value="8" />
  11. <property name="charset" value="UTF-8" />
  12. </module>
  13. <module name="TreeWalker">
  14. <!-- javadoc的检查 -->
  15. <!-- 检查所有的interface和class -->
  16. <module name="JavadocType" />
  17. <!-- 命名方面的检查,它们都使用了Sun官方定的规则。 -->
  18. <!-- 局部的final变量,包括catch中的参数的检查 -->
  19. <module name="LocalFinalVariableName" />
  20. <!-- 局部的非final型的变量,包括catch中的参数的检查 -->
  21. <module name="LocalVariableName" />
  22. <!-- 包名的检查(只允许小写字母) -->
  23. <module name="PackageName">
  24. <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
  25. </module>
  26. <!-- 仅仅是static型的变量(不包括static final型)的检查 -->
  27. <module name="StaticVariableName" />
  28. <!-- 类型(Class或Interface)名的检查 -->
  29. <module name="TypeName" />
  30. <!-- 非static型变量的检查 -->
  31. <module name="MemberName" />
  32. <!-- 方法名的检查 -->
  33. <module name="MethodName" />
  34. <!-- 方法的参数名 -->
  35. <module name="ParameterName " />
  36. <!-- 常量名的检查 -->
  37. <module name="ConstantName" />
  38. <!-- import方面的检查 -->
  39. <!-- import中避免星号"*" -->
  40. <module name="AvoidStarImport" />
  41. <!--
  42. 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import
  43. 与该类在同一个package的
  44. -->
  45. <module name="UnusedImports" />
  46. <!-- 长度方面的检查 -->
  47. <!-- 文件长度不超过1500行 -->
  48. <module name="FileLength">
  49. <property name="max" value="1500" />
  50. </module>
  51. <!-- 每行不超过120个字-->
  52. <module name="LineLength">
  53. <property name="max" value="120" />
  54. </module>
  55. <!-- 方法不超过30行 -->
  56. <module name="MethodLength">
  57. <property name="tokens" value="METHOD_DEF" />
  58. <property name="max" value="30" />
  59. </module>
  60. <!-- 方法的参数个数不超过3个。 并且不对构造方法进行检查-->
  61. <module name="ParameterNumber">
  62. <property name="max" value="3" />
  63. <property name="tokens" value="METHOD_DEF" />
  64. </module>
  65. <!-- 空格检查  -->
  66. <!-- 允许方法名后紧跟左边圆括号"(" -->
  67. <module name="MethodParamPad" />
  68. <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
  69. <module name="TypecastParenPad" />
  70. <!-- 不允许使用"tab"键  -->
  71. <module name="TabCharacter" />
  72. <!-- 关键字 -->
  73. <!--
  74. 每个关键字都有正确的出现顺序。比如 public static final XXX 是对一个常量的声明。如果使用 static
  75. public final 就是错误的
  76. -->
  77. <module name="ModifierOrder" />
  78. <!-- 多余的关键字 -->
  79. <module name="RedundantModifier" />
  80. <!-- 对区域的检查 -->
  81. <!-- 不能出现空白区域 -->
  82. <module name="EmptyBlock" />
  83. <!-- 所有区域都要使用大括号。 -->
  84. <module name="NeedBraces" />
  85. <!-- 多余的括号 -->
  86. <module name="AvoidNestedBlocks">
  87. <property name="allowInSwitchCase" value="true" />
  88. </module>
  89. <!-- 编码方面的检查 -->
  90. <!-- 不许出现空语句 -->
  91. <module name="EmptyStatement" />
  92. <!-- 每个类都实现了equals()和hashCode() -->
  93. <module name="EqualsHashCode" />
  94. <!-- 不许使用switch,"a++"这样可读性很差的代码 -->
  95. <module name="IllegalToken" />
  96. <!-- 不许内部赋值 -->
  97. <module name="InnerAssignment" />
  98. <!-- 绝对不能容忍魔法数 -->
  99. <module name="MagicNumber">
  100. <property name="tokens" value="NUM_DOUBLE, NUM_INT" />
  101. </module>
  102. <!-- 循环控制变量不能被修改 -->
  103. <module name="ModifiedControlVariable" />
  104. <!-- 多余的throw -->
  105. <module name="RedundantThrows" />
  106. <!-- 不许使用未被简化的条件表达式 -->
  107. <module name="SimplifyBooleanExpression" />
  108. <!-- 不许使用未被简化的布尔返回值 -->
  109. <module name="SimplifyBooleanReturn" />
  110. <!-- String的比较不能用!= 和 == -->
  111. <module name="StringLiteralEquality" />
  112. <!-- if最多嵌套3层 -->
  113. <module name="NestedIfDepth">
  114. <property name="max" value="3" />
  115. </module>
  116. <!-- try最多被嵌套2层 -->
  117. <module name="NestedTryDepth">
  118. <property name="max" value="2" />
  119. </module>
  120. <!-- clone方法必须调用了super.clone() -->
  121. <module name="SuperClone" />
  122. <!-- finalize 必须调用了super.finalize() -->
  123. <module name="SuperFinalize" />
  124. <!-- 不能catch java.lang.Exception -->
  125. <module name="IllegalCatch">
  126. <property name="illegalClassNames" value="java.lang.Exception" />
  127. </module>
  128. <!-- 确保一个类有package声明 -->
  129. <module name="PackageDeclaration" />
  130. <!-- 一个方法中最多有3个return -->
  131. <module name="ReturnCount">
  132. <property name="max" value="3" />
  133. <property name="format" value="^$" />
  134. </module>
  135. <!--
  136. 根据 Sun 编码规范, class 或 interface 中的顺序如下: 1.class 声明。首先是 public,
  137. 然后是protected , 然后是 package level (不包括access modifier ) 最后是private .
  138. (多个class放在一个java文件中的情况) 2.变量声明。 首先是 public, 然后是protected然后是 package
  139. level (不包括access modifier ) 最后是private . (多个class放在一个java文件中的情况)
  140. 3.构造函数 4.方法
  141. -->
  142. <module name="DeclarationOrder" />
  143. <!-- 不许对方法的参数赋值 -->
  144. <module name="ParameterAssignment" />
  145. <!-- 确保某个class 在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean 变量是false.) -->
  146. <module name="ExplicitInitialization" />
  147. <!-- 不许有同样内容的String -->
  148. <module name="MultipleStringLiterals" />
  149. <!-- 同一行不能有多个声明 -->
  150. <module name="MultipleVariableDeclarations" />
  151. <!-- 不必要的圆括号 -->
  152. <module name="UnnecessaryParentheses" />
  153. <!-- 各种量度 -->
  154. <!-- 布尔表达式的复杂度,不超过3 -->
  155. <module name="BooleanExpressionComplexity" />
  156. <!-- 类数据的抽象耦合,不超过7 -->
  157. <module name="ClassDataAbstractionCoupling" />
  158. <!-- 类的分散复杂度,不超过20 -->
  159. <module name="ClassFanOutComplexity" />
  160. <!-- 函数的分支复杂度,不超过10 -->
  161. <module name="CyclomaticComplexity" />
  162. <!-- NPath复杂度,不超过200 -->
  163. <module name="NPathComplexity" />
  164. <!-- 杂项 -->
  165. <!-- 禁止使用System.out.println -->
  166. <module name="GenericIllegalRegexp">
  167. <property name="format" value="System\.out\.println" />
  168. <property name="ignoreComments" value="true" />
  169. </module>
  170. <!-- 不许使用main方法 -->
  171. <module name="UncommentedMain" />
  172. <!-- 检查并确保所有的常量中的L都是大写的。因为小写的字母l跟数字1太象了 -->
  173. <module name="UpperEll" />
  174. <!-- 检查数组类型的定义是String[] args,而不是String args[] -->
  175. <module name="ArrayTypeStyle" />
  176. <!--
  177. 检查java代码的缩进 默认配置:基本缩进 4个空格,新行的大括号:0。新行的case 4个空格。
  178. -->
  179. <module name="Indentation" />
  180. </module>
  181. <!-- 检查翻译文件     -->
  182. <module name="Translation" />
  183. </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中的window?preferences?java?code style中可以导入自定义的java编码风格文件。如下图: 
 
点击“Clean Up”,在右侧可以看见一个Import按钮,导入自定义的cleanup文件,点击“OK”即可。左侧的“Formatter”也是如法炮制。具体自定义的checkstyle,cleanup,formatter文件可参考压缩包文件中的公司代码规范文件夹。

时间: 2024-10-10 00:56:37

CheckStyle使用手册(一)的相关文章

阿里巴巴 Java 开发手册评述

2016年底,阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,笔者当时看到的版本为v1.0.2版.下载地址可以在其官方社区--云栖社区找到. 笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得是一份不可多得的好材料.正如阿里巴巴在发布时所说,"阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是公司近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举了如何开发更加高效.更加容错.更加有协作性,力求知其然,更知其不然.结合正反例,让Ja

eclipse插件之Findbugs、Checkstyle、PMD安装及使用

一.什么是Findbugs.checkstyle.PMD Findbugs.checkstyle和PMD都可以作为插件插入eclipse,当然也有单独的工具可以实现他们的功能,比如Findbugs Tool就可以不必插入eclipse就可以使用. 三者的功能如下表: 工具 目的 检查项 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug 主要检查bytecode中的bug patterns,如NullPoint空指

angular参考手册拷贝

AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ng-bind-html 绑定 HTML 元素的 innerHTML 到应用程序数据,并移除 HTML 字符串中危险字符 ng-bind-template 规定要使用模板替换的文本内容 ng-blur 规定 blur 事件的行为 ng-change 规定在内容改变时要执行的表达式 ng-check

Exchange 2013迁移SOP手册

Exchange 2013迁移SOP手册 阶段1:环境部署 OUTLOOK升级方式 统计版本低于SP3的OUTLOOK客户端信息 记录计算机在域中所在OU信息 域中创建临时升级用OU,如MAILUPGRADE 采用如下命令移动计算机到MAILUPGRADE OU dsmove "CN=Aidong Qi,OU=Users,OU=TESTP,OU=Hitech,DC=hitechad,DC=com" -newparent OU=MAILUPGRADE,DC=hitechad,DC=com

oracle11g dataguard 完全手册

一.前言: 网络上关于dataguard的配置文章很多,但是很多打着oracle11g的文章实际都是只能在9 10 上运行,比如FAL_CLIENT在11g中已经废弃,但是现在网络上的文章都是没有标注这一点.而且对于具体含义语焉不详对于新手只能知其然而不知其所以然.这篇文章我就想让像我这样的人对于dataguard配置不仅仅知道怎么配置,还要知道为什么需要这样配置,这样的效果才是最好的. 这篇文章不仅仅是记录如何配置,还介绍了为什么是这样,以及注意要点,我希望这个文章可以作为进行dataguar

小书匠语法使用手册

小书匠语法使用手册 小书匠 语法 MARKDOWN 帮助 常用语法 标题 1这是 H1 一级标题 2------ 3这是 H2 二级标题 4====== 5# 这是 H1 一级标题 6## 这是 H2 二级标题 7### 这是 H3 三级标题 8#### 这是 H4 四级标题 9##### 这是 H5 五级标题 10###### 这是 H6 六级标题 11 快捷键: [ctrl + h] 列表 无序列表 1* 项目1 2 * 子项目1.1 3 * 子项目1.2 4 * 子项目1.2.1 5* 项

[笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量

[笔记][Java7并发编程实战手册]系列目录 简介 本文学习信号量Semaphore机制. Semaphore 本质是一个共享锁 内部维护一个可用的信号集,获取信号量之前需要先申请获取信号数量:用完之后,则需要释放信号量:如果不释放,那么其他等待线程则一直阻塞直到获取信号量或则被中断为止 本人的理解是:互斥锁是同一时间只能一个线程访问,而在这里,是同一时间允许获取到了信号量的线程并发访问,而没有获取到信号量的则必须等待信号量的释放: 将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,

SVN Server环境安装配置手册

SVN Server环境安装配置手册_百度文库 http://wenku.baidu.com/link?url=923bv1olSkznh1gWd7Gqoxxwj18IHIlTXcEbNiPSLM5H32k93UtQ22rAVppNIlVv89ru4E1cPFe1yESSEkSsR4NfDMMRgpA2d3GI_KcV37m

《开源分享1》:前端开发必备《Html-CSS中文手册》

一直想做一些优秀的资源分享内容,今天尝试整理了一下,以后会每天抽点时间发一些自认为不错的资料出来.帮助大家提高学习效率. 今天分享的内容:前端开发:<Html-CSS中文手册>! 本手册针对的是已有一定网页设计制作经验的读者.其目的是提供完整清晰的样式表内容的快速索引及进阶帮助.所以对于网页制作和样式表的基础知识,仅简单介绍,恕不赘述. 手册提供了完整的 CSS2.0 的属性(Properties).规则(At-Rules).伪类(Pseudo-Classes).伪元素(Pseudo-Elem