首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

checkstyle施用详解

2012-09-19 
checkstyle使用详解代码格式化的好处我想我就不需要说了,大家肯定也都理解其优点,否则你也不会看这个文档.

checkstyle使用详解

代码格式化的好处我想我就不需要说了,大家肯定也都理解其优点,否则你也不会看这个文档.
??? 这里我以CheckStyle3.4为例,讲解CheckStyle的使用,确切的说是其配置的详细解释,如果你是Checkstyle3.4以下,那么有一部分module将是不可以允许的,请删除之;在这份文档中我试图把所有的module都分析讲解一次,同时下面的这份文档也是我的设置,对于我个人不喜欢的设置我都注释了,如果你需要请取消注释或如何!!
??? Checkstyle简介,其是目前最广泛使用的代码检查工具,功能强大,操作简单可以和Ant结合使用,最重要的是其是Open Source的,你不用担心收到律师函,哈哈!
??? 主页: http://checkstyle.sourceforge.net/
??? 下载本文示例: olics_checkstyle_checks.zip 开始我们的讲解:
首先,Checkstyle可以和Ant结合使用,下面是Ant脚步片断

    <!--CheckStyle配置,这里你替换成你实际的环境--> <property name="checkstyle.config" value="${project.docs.dir}/checkstyle_checks.xml"/> <property name="checkstyle.report.style" value="${project.docs.dir}/checkstyle-frames.xsl"/> <property name="checkstyle.result" value="${build.checkstyleReport.dir}/checkstyle_result.xml"/> <property name="checkstyle.report" value="${build.checkstyleReport.dir}/checkstyle_report.html"/> <!—CheckStyle脚步--> <taskdef resource="checkstyletask.properties" classpathref=" checkstyle-all-3.4.jar"/> <target name="checkstyle_check" depends="init"> <checkstyle config="${checkstyle.config}" failOnViolation="false" failureProperty="checkstyle.failure"> <formatter type="xml" tofile="${checkstyle.result}"/> <fileset dir="${project.src.dir}" includes="**/*.java"/> </checkstyle> <!—生成报告,其格式取决于${checkstyle.report.style}--> <style in="${checkstyle.result}" out="${checkstyle.report}" style="${checkstyle.report.style}"/> </target>


    下面是我理解的 Checkstyle 的使用 :

      <?xml?version="1.0"?encoding="UTF-8"?>? ??<!DOCTYPE?module?PUBLIC?"-//Puppy?Crawl//DTD?Check?Configuration?1.2//EN"? ??"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">? ??<!--?对于所有的模块来书,如果有这个模块则说明检测这一项,没有则不检测这一项?-->? ??<!--?所有的模块中,其ROOT必须为Checker?-->? ??<module?name="Checker">? ??<!--?检验每个包是否存在package.html文件-->? ??<!--?See?http://checkstyle.sf.net/config_javadoc.html#PackageHtml?-->? ??<!--? ??<module?name="PackageHtml"/>? ??-->? ??<!--?检验每个文件末尾是否有一个空行,在UNIT机器上是有的,在CVS上如果没有会有警告的-->? ??<!--?See?http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile?-->? ??<!--? ??<module?name="NewlineAtEndOfFile"/>? ??-->? ??<!--?Checks?that?property?files?contain?the?same?keys.?-->? ??<!--?See?http://checkstyle.sf.net/config_misc.html#Translation?-->? ??<module?name="Translation"/>? ??<module?name="TreeWalker">? ??<!--?Checks?for?Javadoc?comments.?-->? ??<!--?See?http://checkstyle.sf.net/config_javadoc.html?-->? ??<!--?Checks?Javadoc?comments?for?method?definitions.-->? ??<module?name="JavadocMethod">? ??<property?name="scope"?value="public"/>? ??<!--?是否允许错误的参数声明,true为允许,缺省为不允许?-->? ??<property?name="allowMissingParamTags"?value="true"/>? ??<!--?是否允许错误的错误声明,true为允许,缺省为不允许?-->? ??<property?name="allowMissingThrowsTags"?value="true"/>? ??<!--?是否允许错误的返回类型声明,true为允许,缺省为不允许?-->? ??<property?name="allowMissingReturnTag"?value="true"/>? ??</module>? ??<!--Checks?Javadoc?comments?for?class?and?interface?definitions.-->? ??<module?name="JavadocType"/>? ??<!--?Checks?that?variables?have?Javadoc?comments.-->? ??<module?name="JavadocVariable">? ??<property?name="scope"?value="protected"/>? ??</module>? ??<!--?检查Javadoc的格式?-->? ??<module?name="JavadocStyle">? ??<property?name="scope"?value="public"/>? ??<!--?Comment的第一句的末尾是否要有一个句号,true必须有,defaulttrue?-->? ??<property?name="checkFirstSentence"?value="false"/>? ??<!--?检查错误的HTML脚本,比如不匹配,true检查,defaulttrue?-->? ??<property?name="checkHtml"?value="true"/>? ??</module>? ??<!--?Checks?for?Naming?Conventions.?-->? ??<!--?See?http://checkstyle.sf.net/config_naming.html?-->? ??<!--?确省必须以Abstract开始或者以Factory结束?-->? ??<!--? ??<module?name="AbstractClassName"/>? ??-->? ??<module?name="ConstantName"/>? ??<module?name="LocalFinalVariableName"/>? ??<module?name="LocalVariableName"/>? ??<module?name="MemberName"/>? ??<module?name="MethodName"/>? ??<module?name="PackageName"/>? ??<module?name="ParameterName"/>? ??<module?name="StaticVariableName"/>? ??<module?name="TypeName"/>? ??<!--?Checks?for?Headers?-->? ??<!--?See?http://checkstyle.sf.net/config_header.html?-->? ??<!--?检查文件是否以指定文件开始,这里最好是放一些版权信息和工程描述?-->? ??<!--?headerFile:指定的文件?-->? ??<!--?ignoreLines:忽略哪些行,以","分隔?-->? ??<!--? ??<module?name="Header">? ??<property?name="headerFile"?value="java.header"/>? ??<property?name="ignoreLines"?value="2,?3,?4,?5"/>? ??</module>? ??-->? ??<!--?Following?interdivts?the?header?file?as?regular?exdivssions.?-->? ??<!--? ??<module?name="RegexpHeader"/>? ??-->? ??<!--?Checks?for?imports?-->? ??<!--?See?http://checkstyle.sf.net/config_import.html?-->? ??<!--?检查使用*号的导入,默认为全部类?-->? ??<module?name="AvoidStarImport"/>? ??<!--?检查是否有非法的包,确省检查sun.*;对于某些包是不建议直接调用的?-->? ??<module?name="IllegalImport">? ??<property?name="illegalPkgs"?value="sun.*"/>? ??</module>? ??<!--?检查多于的导入,如一个类导入了多次?-->? ??<module?name="RedundantImport"/>? ??<!--?检查没有使用的导入?-->? ??<module?name="UnusedImports"/>? ??<!--?导入排序?-->? ??<!--?groups:分组,哪些是一组的?-->? ??<!--?ordered:同一个组内是否排序,true排序,确省为true?-->? ??<!--?separated:各个组之间是否需要用空行分隔,确省为false?-->? ??<!--?caseSensitive:是否是大小写敏感的,确省是?-->? ??<!--? ??<module?name="ImportOrder">? ??<property?name="groups"?value="java,javax"/>? ??<property?name="ordered"?value="true"/>? ??<property?name="separated"?value="true"/>? ??<property?name="caseSensitive"?value="true"/>? ??</module>? ??-->? ??<!--?Checks?for?Size?Violations.?-->? ??<!--?See?http://checkstyle.sf.net/config_sizes.html?-->? ??<!--?检查方法内可执行语句的个数,确省为30行?-->? ??<!--? ??<module?name="ExecutableStatementCount">? ??<property?name="max"?value="30"/>? ??</module>? ??-->? ??<!--?文件的最大行数,缺省为1500?-->? ??<module?name="FileLength">? ??<property?name="max"?value="2000"/>? ??</module>? ??<!--?每行的最大字符数,缺省为80?-->? ??<module?name="LineLength">? ??<!--?忽略指定格式的行,如*号开始的,等?-->? ??<!--? ??<property?name="ignorePattern"?value="^?*\*?*[^?]+$"/>? ??-->? ??<property?name="max"?value="120"/>? ??</module>? ??<!--?方法的最大行数,缺省为150?-->? ??<module?name="MethodLength">? ??<property?name="max"?value="200"/>? ??<!--?统计时是否包括空行和以//开始的注释,缺省为统计(true)-->? ??<property?name="countEmpty"?value="false"/>? ??</module>? ??<!--?匿名类的最大行数,缺省为20?-->? ??<module?name="AnonInnerLength">? ??<property?name="max"?value="60"/>? ??</module>? ??<!--?检查方法和构造子参数的最大个数,缺省为7?-->? ??<module?name="ParameterNumber"/>? ??<!--?Checks?for?whitespace?-->? ??<!--?See?http://checkstyle.sf.net/config_whitespace.html?-->? ??<module?name="EmptyForInitializerPad"/>? ??<module?name="EmptyForIteratorPad"/>? ??<module?name="MethodParamPad">? ??<property?name="allowLineBreaks"?value="true"/>? ??</module>? ??<module?name="NoWhitespaceAfter"/>? ??<module?name="NoWhitespaceBefore"/>? ??<module?name="OperatorWrap"/>? ??<module?name="ParenPad"/>? ??<module?name="TypecastParenPad"/>? ??<module?name="TabCharacter"/>? ??<module?name="WhitespaceAfter"/>? ??<module?name="WhitespaceAround"/>? ??<!--?Modifier?Checks?-->? ??<!--?See?http://checkstyle.sf.net/config_modifiers.html?-->? ??<!--?要求JLS?suggestions?-->? ??<!--? ??<module?name="ModifierOrder"/>? ??-->? ??<module?name="RedundantModifier"/>? ??<!--?Checks?for?blocks.?You?know,?those?{}'s?-->? ??<!--?See?http://checkstyle.sf.net/config_blocks.html?-->? ??<!--?检查空块?-->? ??<!--? ??<module?name="EmptyBlock"/>? ??-->? ??<module?name="LeftCurly"/>? ??<!--?检查只有必须有{},确省为必须,主要在if,else时有这样的情况?-->? ??<module?name="NeedBraces"/>? ??<!--?检查"}",确省在同一行?-->? ??<module?name="RightCurly">? ??<property?name="option"?value="alone"/>? ??</module>? ??<!--?检查多余嵌套的{},请看文档,不易说明?-->? ??<module?name="AvoidNestedBlocks"/>? ??<!--?Checks?for?common?coding?problems?-->? ??<!--?See?http://checkstyle.sf.net/config_coding.html?-->? ??<module?name="AvoidInlineConditionals"/>? ??<module?name="CovariantEquals"/>? ??<module?name="DeclarationOrder"/>? ??<module?name="DefaultComesLast"/>? ??<module?name="DoubleCheckedLocking"/>? ??<!--? ??<module?name="EmptyStatement"/>? ??-->? ??<module?name="EqualsHashCode"/>? ??<!--?变量必须初始化为自己的类型,如果给一个Object类型的变量初始化为null会提示?-->? ??<!--? ??<module?name="ExplicitInitialization"/>? ??-->? ??<module?name="FallThrough"/>? ??<!--? ??<module?name="FinalLocalVariable"/>? ??-->? ??<module?name="HiddenField">? ??<property?name="ignoreConstructorParameter"?value="true"/>? ??<property?name="ignoreSetter"?value="true"/>? ??</module>? ??<!--?Exception,?Throwable,?RuntimeException是不允许catch的?-->? ??<!--? ??<module?name="IllegalCatch"/>? ??-->? ??<module?name="IllegalInstantiation"/>? ??<!--?有一个bug,比如i++居然都不认?<module?name="IllegalToken"/>? ??-->? ??<module?name="IllegalTokenText"/>? ??<module?name="IllegalType"/>? ??<module?name="InnerAssignment"/>? ??<!--检查直接数? ??<module?name="MagicNumber"/>? ??检查是否有构造子? ??<module?name="MissingCtor"/>? ??-->? ??<module?name="MissingSwitchDefault"/>? ??<module?name="MultipleVariableDeclarations"/>? ??<!--? ??<module?name="JUnitTestCase"/>? ??<module?name="NestedIfDepth"">? ??<property?name="max"?value="5"/>? ??</module>? ??<module?name="NestedTryDepth"">? ??<property?name="max"?value="5"/>? ??</module>? ??<module?name="PackageDeclaration"/>? ??<module?name="ReturnCount"/>? ??-->? ??<!--?不能为参数付值?-->? ??<!--? ??<module?name="ParameterAssignment"/>? ??-->? ??<module?name="RedundantThrows"/>? ??<!--?不能理解的,好像是bug? ??<module?name="RequireThis"/>? ??-->? ??<module?name="SimplifyBooleanExdivssion"/>? ??<module?name="SimplifyBooleanReturn"/>? ??<module?name="StringLiteralEquality"/>? ??<module?name="SuperClone"/>? ??<module?name="SuperFinalize"/>? ??<module?name="UnnecessaryParentheses"/>? ??<!--?Checks?for?class?design?-->? ??<!--?See?http://checkstyle.sf.net/config_design.html?-->? ??<!--?要求一个方法必须声明为Extension的,否则必声明为abstract,?final?or?empty?-->? ??<!--? ??<module?name="DesignForExtension"/>? ??-->? ??<!--?检查private构造子是否声明为final,这里有个问题,在Java中构造子是不能声明为final的?-->? ??<!--? ??<module?name="FinalClass"/>? ??-->? ??<!--?要求一定要有一个构造子?-->? ??<!--? ??<module?name="HideUtilityClassConstructor"/>? ??-->? ??<module?name="InterfaceIsType"/>? ??<!--?检查变量的可见性,确省只允许static?final?为public,否则只能为private?-->? ??<module?name="VisibilityModifier">? ??<property?name="packageAllowed"?value="true"/>? ??<property?name="protectedAllowed"?value="true"/>? ??</module>? ??<!--? ??<module?name="MutableException"/>? ??-->? ??<!--?限制抛出声明的指定数量,确省为1?-->? ??<!--? ??<module?name="ThrowsCount"/>? ??-->? ??<!--?Miscellaneous?other?checks.?-->? ??<!--?See?http://checkstyle.sf.net/config_misc.html?-->? ??<!--?数组的声明是否允许Java的类型,确省为允许,Java类型为String[]?xx,C++的类型为String?xx[];?-->? ??<module?name="ArrayTypeStyle"/>? ??<!--? ??<module?name="FinalParameters"/>? ??-->? ??<!--?一般性的代码问题,不好的习惯等,可以多?-->? ??<!--?文件中使用了System.out.print等-->? ??<module?name="GenericIllegalRegexp">? ??<property?name="format"?value="System\.out\.print"/>? ??<property?name="message"?value="bad?practice?of?use?System.out.print"/>? ??</module>? ??<module?name="GenericIllegalRegexp">? ??<property?name="format"?value="System\.exit"/>? ??<property?name="message"?value="bad?practice?of?use?System.exit"/>? ??</module>? ??<module?name="GenericIllegalRegexp">? ??<property?name="format"?value="printStackTrace"/>? ??<property?name="message"?value="bad?practice?of?use?printStackTrace"/>? ??</module>? ??<!--?关于Task,你可以声明自己的Task标识?-->? ??<module?name="TodoComment">? ??<property?name="format"?value="TODO"/>? ??</module>? ??<!--?强迫//注释必须如何,入下要求只能有一行,具体看文档?-->? ??<!--? ??<module?name="TrailingComment">? ??<property?name="format"?value="^\\s*$"/>? ??</module>? ??-->? ??<!--?main方法经常会在debug时使用,但发行版本的时候可能并不需要这个方法,提示?-->? ??<!--? ??<module?name="UncommentedMain"/>? ??-->? ??<!--?当定义一个常量时,希望使用大写的L来代替小写的l,原因是小写的l和数字1很象?-->? ??<module?name="UpperEll"/>? ??<!--?检查正确的缩进,这个更象是个人习惯?-->? ??<!--? ??<module?name="Indentation">? ??<property?name="braceAdjustment"?value="0"/>? ??</module>? ??-->? ??<!--?Checks?For?Metrics?-->? ??<!--?See?http://checkstyle.sf.net/config_metrics.html?-->? ??<!--?检查嵌套复杂度?-->? ??<module?name="CyclomaticComplexity">? ??<property?name="max"?value="12"/>? ??</module>? ??</module>? ??</module>??

热点排行