配置管理工具之五checkstyle.docx
《配置管理工具之五checkstyle.docx》由会员分享,可在线阅读,更多相关《配置管理工具之五checkstyle.docx(24页珍藏版)》请在冰豆网上搜索。
配置管理工具之五checkstyle
1、CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。
它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来;
2、CheckStyle检验的主要内容:
Javadoc注释、命名约定、标题、Import语句、体积大小、空白、修饰符、块、代码问题、类设计、混合检查(包活一些有用的比如非必须的System.out和printstackTrace),CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。
但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大;
3、CheckStyle的主要运行方式:
它的配置文件是基于XML而非Properties文件,它的3.0版本提供了两种运行的方式:
命令行工具和ANT任务,同时,CheckStyle目前有很多针对流行IDE的插件,例如Eclipse、IntelliJIDEA、JBuilder等。
但是,大部分都是基于2.4的版本,新版本的特性不支持,同时配置也较为复杂,因为一般情况下,如果与开发过程与环境集成起来,编码规范的检查会更加有效,因此,作为ANT任务的运行方式使用的更加普遍;
4、在ANT的build.xml文件中添加CheckStyle任务的步骤:
1.将checkstyle-all-3.1.jar拷贝到项目的lib目录;2、建立配置文件;3.声明CheckStyle任务:
<taskdefresource="checkstyletask.properties"classpath="${lib}/checkstyle-all-3.1.jar"/>
5、建立CheckStyle任务:
<targetname="checkstyle">
<checkstylec>
<filesetdir="${src}"includes="**/*.java"/>
</checkstyle>
</target>
6、定制CheckStyle
CheckStyle的执行基于XML配置文件,它的主要组成部分是:
Module:
整个配置文件就是一棵Module树。
根节点是CheckerModule。
Properties:
它来决定一个Module如何进行检查。
每个Module都有一个默认值,如果不满足开发需求,可以设定其它的值。
下面是一个示例:
<modulename="MethodLength">
<propertyname="max"value="60"/>
</module>
它表示,如果方法或者构造函数的长度超过60行,CheckStyle就会报错。
而默认值是150行。
以下是一段CheckStyle对于Maven项目源文件的检查报告:
Method'createExpression'isnotdesignedforextension-needstobeabstract,finalorempty.91
UnabletogetclassinformationforJellyException.91
Linehastrailingspaces.93
Linehastrailingspaces.104
Method'evaluate'isnotdesignedforextension-needstobeabstract,finalorempty.113
Parametercontextshouldbefinal.113
Linehastrailingspaces.130
Method'getExpressionText'isnotdesignedforextension-needstobeabstract,finalorempty.131
Linehastrailingspaces.134
Linehastrailingspaces.135
Method'toString'isnotdesignedforextension-needstobeabstract,finalorempty.137
Method'isSupportAntVariables'isnotdesignedforextension-needstobeabstract,finalorempty.156
Method'setSupportAntVariables'isnotdesignedforextension-needstobeabstract,finalorempty.168
ParametersupportAntVariablesshouldbefinal.168
'supportAntVariables'hidesafield.168
Method'isValidAntVariableName'isnotdesignedforextension-needstobeabstract,finalorempty.183
Parametertextshouldbefinal.183
一般情况下,与IDE集成在一起使用的时候,点击出错的条目,可以跳转到相应的代码。
7、CheckStyle的最佳实践
3.1.Sun’sCodeConventions的修改
在CheckStyle的最新发布版本中,有一个对于Sun的Java编码规范的配置文件信息。
但是,其中有很多条目并不一定符合项目开发的需要。
就算是对于很多优秀的开源项目,按照这个规范来进行检查,也会出现成千上万的错误。
下面提出的一些修改意见,是从实际项目执行过程中总结出来的,可以作为大家的参考。
我们以CheckStyle3.0配置文件的顺序来介绍:
1.去除对于每个包都有一个package.html文件的限制;
<!
--<modulename="PackageHtml"/>-->
2.修改对于JavaDocComments的限定:
对于很多使用CodeGenerator的项目来说,需要将手写代码与生成代码、单元测试代码的检查分开进行;
3.修改对于体积大小的限制:
目前,很多显示器都是17寸,而且打印方面的限制也比以前有所改善,同时,由于代码中Factory等模式的运用,以及有意义的方法名称等约定,默认每行代码的长度(80)是远远不能满足要求;对于方法长度等等,也应该根据项目情况自行决定:
<modulename="FileLength"/>
<modulename="LineLength">
<propertyname="max"value="120"/>
</module>
<modulename="MethodLength">
<propertyname="max"value="300"/>
</module>
<modulename="ParameterNumber"/>
4.修改对于Throws的的限制:
允许ThrowsUncheckedException以及ThrowsSubclassOfAnotherDeclaredException。
<modulename="RedundantThrows">
<propertyname="allowUnchecked"value="true"/>
<propertyname="allowSubclasses"value="true"/>
</module>
5.修改成员变量的可视性:
一般情况下,应该允许ProtectedMembers以及PackageVisibleMembers。
<modulename="VisibilityModifier">
<propertyname="protectedAllowed"value="true"/>
<propertyname="packageAllowed"value="true"/>
</module>
3.2.CheckStyle应用的最佳实践
采用CheckStyle以后,编码规范的检查就变得及其简单,可以作为一项切实可行的实践加以执行。
一般情况下,在项目小组中引入CheckStyle可以按照下面的步骤进行:
1.强调CodeReview与CodeConventions的重要作用;
2.介绍CheckStyle;
3.初步应用CheckStyle:
参照CheckStyle附带的配置文件,酌情加以剪裁,在项目的Ant配置文件中,添加CheckStyle任务,可以单独执行;
4.修改、定型CheckStyle的配置文件:
按照基本配置文件执行一段时间(2~3周),听取开发人员的反馈意见,修改配置信息;
5.作为开发过程的日常实践,强制执行CheckStyle:
稳定CheckStyle的配置信息,同时将CheckStyle任务作为Build的依赖任务或者配置源码控制系统(目前,CheckStyle可以与CVS有效集成),使得代码在加入系统之前必须通过检查。
同时需要指出的是,CheckStyle的有效执行需要依赖两个条件:
·Ant的广泛应用:
CheckStyle基于Ant执行的方式比较容易,而且可以在项目内容形成一致的执行环境。
同时,也比较容易与其它任务,例如Build等发生关联。
·IDEFormatCode的强大功能:
由于CheckStyle本身并没有提供很强大的CodeFormat等功能,因此,需要借助IDE的帮助,从而使得在发生错误的时候,可以很容易的进行修复。
目前,主流的JavaIDE都提供了这方面的功能,IDEA在这方面尤其突出。
它提供的统一、可定义的CodeFormatTemplate(项目小组内部可以使用统一模板)以及方便的快捷键功能(Ctrl+Alt+T:
FormatCode,Ctrl+Alt+O:
OptimizeImport等)。
四、结论
利用CheckStyle可以方便的对于编码的CodeConventions进行检查,同时,也有效地减少了CodeReview的工作,使得Reviw人员的精力更多的集中到逻辑和性能检查。
Checkstyle的结果输出
序号输出内容意义
1TypeismissingajavadoccommentClass缺少类型说明
2“{”shouldbeonthepreviousline“{”应该位于前一行
3Methosismissingajavadoccomment方法前面缺少javadoc注释
4Expected@throwstagfor“Exception”在注释中希望有@throws的说明
5“.”Ispreceededwithwhitespace“.”前面不能有空格
6“.”Isfollowedbywhitespace“.”后面不能有空格
7“=”isnotpreceededwithwhitespace“=”前面缺少空格
8“=”isnotfollowedwithwhitespace“=”后面缺少空格
9“}”shouldbeonthesameline“}”应该与下条语句位于同一行
10Unused@paramtagfor“unused”没有参数“unused”,不需注释
11Variable“CA”missingjavadoc变量“CA”缺少javadoc注释
12Linelongerthan80characters行长度超过80
13Linecontainsatabcharacter行含有”tab”字符
14Redundant“Public”modifier冗余的“public”modifier
15FinalmodifieroutoforderwiththeJSLsuggestionFinalmodifier的顺序错误
16Avoidusingthe“.*”formofimportImport格式避免使用“.*”
17Redundantimportfromthesamepackage从同一个包中Import内容
18Unusedimport-java.util.listImport进来的java.util.list没有被使用
19Duplicateimporttoline13重复Import同一个内容
20Importfromillegalpackage从非法包中Import内容
21“while”constructmustuse“{}”“while”语句缺少“{}”
22Variable“sTest1”mustbeprivateandhaveaccessormethod变量“sTest1”应该是private的,并且有调用它的方法
23Variable“ABC”mustmatchpattern“^[a-z][a-zA-Z0-9]*$”变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$”
24“(”isfollowedbywhitespace“(”后面不能有空格25“)”isproceededbywhitespace“)”前面不能有空格
不太明白的错误解答
1.'X'hidesafield.
publicclassFoo
{
privateintbar;
publicFoo(intbar)
{
this.bar=bar;
}
publicfinalintgetBar()
{
returnbar;
}
}
解释:
全局privateintbar;和局部publicFoo(intbar)的bar变量名字重复。
此错误,可以忽略不检查。
2.ParameterXshouldbefinal.
publicclassFoo
{
privateintbar;
publicFoo(intbar)
{
this.bar=bar;
}
publicfinalintgetBar()
{
returnbar;
}
}
解释:
publicFoo(intbar)的局部变量,被认为是不可改变的,检查需要加上final关键字定义publicFoo(finalintbar)
此错误,可以忽略不检查。
3.Redundant'X'modifier.
publicinterfaceCacheHRTreeServiceextendsManager{
/**
*OrganizationTree
*
*@paramorgDto
*@return
*@throwsException
*/
publicvoidsetOrganization(OrganizationDTOorgDto)throwsException;
/**
*OrganizationTree
*
*@return
*@throwsException
*/
publicOrganizationDTOgetOrganization()throwsException;
......
}
解释:
多余的字段。
publicOrganizationDTOgetOrganization()throwsException;此时public为多余的字段,因为interface定义的时候,就是public的。
需要检查。
4.-ClassXshouldbedeclaredasfinal.
解释:
对于单例设计模式,要求返回唯一的类对象。
但是HRFactory和ContextFactory为优化的两个类,不需求检查。
其他的单例类,依然需要进行检查。
5.Utilityclassesshouldnothaveapublicordefaultconstructor.
解释:
工具类不必提供默认的构造方法。
需要检查,仅仅为提示。
6.Filedoesnotendwithanewline.
解释:
虽然JAVA程序不要求结尾要用新行,但是习惯上应该要空一行。
需要检查,仅仅为提示。
7.-Method'addChildrenId'isnotdesignedforextension-needstobe
abstract,finalorempty.
解释:
通过父类继承的,此类有点特殊
可以忽略此类。
8.Variable'id'mustbeprivateandhaveaccessormethods.
解释:
BaseHRDTO类,为父类,属性给子类继承,比较特殊。
但是其他的类,声名需要加上范围'private'关键字
需要检查。
9.-Arraybracketsatillegalposition.
解释:
代码写法,习惯
Eclipse插件安装和使用
步骤一:
勾选SetProjectDirasCheckjstyleBasedir
步骤二:
右键选中你要进行checkstyle的项目文件,选择“properties”。
如下图:
勾选EnableCheckstyle和SetProjectClassLoader.
然后再CheckstyleConfiguraionFile中选择项目中checkstyle的配置文件。
这里我把配置文件时放置在项目根目录下,所以点击右侧“Browse”按钮,在项目根目录下选择该文件。
按“OK”按钮。
这样整个项目的代码将根据配置文件中设置的原则进行出错提示.结果如下图:
由图可知对不符合代码规范的代码会有错误提示,并且有提示信息。
Maven插件安装和使用
首先,修改要检查代码库top级的pom.xml文件,在build部分配置CheckStyle的Maven插件,以便于下载安装对应版本的插件(Maven会自动从其镜像库中下载),方法如下:
Java代码
1.
2....
3.
4.
5.
6.org.apache.maven.plugins
7.maven-checkstyle-plugin
8.2.3
9.
10.
11.
12....
13.
maven-checkstyle-plugin的最新版本为2.5,其对应的CheckStyle核心版本为5.0;maven-checkstyle-plugin2.3对应的CheckStyle核心版本为4.4。
查看插件的pom文件,可看到如下内容,其中的版本号就为对应的CheckStyle的版本号。
Java代码
1.
2.checkstyle
3.checkstyle
4.4.4
5.
接下来,将自定义的规则配置文件拷贝到top级目录,在reporting部分的CheckStyle插件配置中引用配置。
Java代码
1.
2.
3.
4.org.apache.maven.plugins
5.maven-checkstyle-plugin
6.
7.my_checks.xml
8.
9.
10.
11.
也可以将配置文件放在子文件夹下,配置中带上相对路径即可。
Java代码
1.
2.
3.
4.org.apache.maven.plugins
5.maven-checkstyle-plugin
6.
7.build-tools/src/main/resources/xx/my_checks.xml
8.
9.
10.
11.
如果使用插件自带的规则文件,可以作如下配置。
maven-checkstyle-plugin插件自带的规则有sun_checks.xml、maven_checks.xml等,可查看插件包。
Java代码
1.
2.
3.
4.org.apache.maven.plugins
5.maven-checkstyle-plugin
6.
7.config/maven_checks.xml
8.
9.2.3
10.
11.
12.
在reporting部分增加jxr插件,生成代码报告,这样在CheckStyle报告中点击问题对应的链接就可以直接看到出错的