版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z.代码检测工具箱——checkstyle、findbugs、pmd-cpd目录一.目的:3二.取舍:3三.期望结果:3四.步骤:31.准备工具32.脚本规划43.checkout43.1脚本编写53.2执行53.3问题处理64.javac74.1脚本74.2执行75.jar85.1脚本86.checkstyle86.1脚本96.2变量定义96.3环境初始化脚本106.3执行106.4自定义规则107.findbugs137.1脚本137.2执行138.cpd148.1脚本148.2执行149.完整脚本14一.目的:最近要跟踪一个工程的代码质量,保障工程质量。个人总是认为,质量保障这个东西要用数据说话的。代码走查是一个方面,但要能使用工具完成局部标准化的代码走查,发现局部错误,也不失为一种不错的补充手段。结合之前自己用过、听过的几种开源工具,整合到一起,实现一个适合目前工程的简单工具。二.取舍:首先是工具的选择,经过多个工具的使用结合目前工程组成员的水平和状态,决定从几个方面进展检查:常规bug编码标准重复代码不想检查太多,以前没有开展过这方面的工作,领导是否支持,工程成员反响是否良好都很难说,如果大家都喜欢再完善更多的检查也不晚。其实还差一个依赖的检测,但现在工程使用的是ssh的架构,现有依赖检查的工具中,对spring的支持都不是很好,遂放弃。对于工具的选择,紧着自己熟悉的就选择了checkstyle、findbugs和pmd的cpd工具。三.期望结果:使用ant脚本,一步完成所有工作,针对工程直接产生检查报告。四.步骤:1.准备工具ant、checkstyle、findbugs、pmd下载。还要下载cvs和eclipse,因为脚本中需要使用cvs更新代码,eclipse会让ant脚本的编辑和环境配置更加简单。2.脚本规划规划脚本,整个脚本分为几个局部,如下:<"*mlversion="1.0"encoding="utf-8""><projectname="myProject"default="start"><!--变量定义--><!--环境初始化--><!--checkout--><!--javac--><!--jar--><!--checkstyle--><!--findbugs--><!--pmdcpd--><!--run--><targetname="start"></target></project>整个脚本规划描述了脚本执行的过程,每个注释都将添加具体的内容。系统执行start任务,这个任务通过依赖调用其他任务,任务间通过依赖定义过程。首先"变量定义〞中定义变量,便于将来多个工程复用。"环境初始化〞中初始化环境,所有环境清理和环境建立都在这里完成。"checkout〞完成cvs的更新工作。由于findbugs需要检查二进制代码,"javac〞完成代码编译工作。同样为findbugs需要,"jar〞将代码打包。"checkstyle〞完成代码拼写检查。"findbugs〞完成bug检查"pmdcpd〞使用pmd的cpd功能检查重复代码。3.checkout变量定义和环境初始化局部,在需要时随时添加,首先是checkout过程,将代码检出cvs库。3.1脚本编写checkout局部脚本如下:<targetname="checkoutlib"depends="mkDir"><cvscvsroot="${cvsroot}"package="WorkingArea/Code/lib"/></target><targetname="checkoutsrc"depends="checkoutlib"><cvscvsroot="${cvsroot}"package="WorkingArea/Code/project"/></target>checkoutlib检出公共库,checkoutsrc检出代码,同时在变量定义局部定义cvsroot变量,如下:<propertyname="cvsroot"value=":pserver:wangjian*uan:passwordscm1.domain.:/repository/project"/>其中文字局部与我们常用的cvs写法一样,可以参考eclipse中的cvs视图的局部。注意:上面脚本中依赖的mkDir任务是初始化局部的,为了建立相关的目录,后面有详细描述。3.2执行eclipse中执行ant就是有这点好,缺少什么不用去修改环境变量,eclipse内部就解决了。执行前有几个地方需要确认:脚本上点右键-"RunAs-"AntBuild…注意,一定是带有省略号的菜单,这个菜单才能配置环境,翻开界面如下列图:这里Targets可以选择要执行的任务,执行时会连依赖的任务一起执行。ClassPath定义依赖的类库,JRE用来定义JRE的版本,Environment标签很重要,可以定义一些环境变量中未定义的变量,这里我因为一直没有找到cvs路径,但命令行中能够找到cvs,所以把Path环境变量复制定义到这里了,如下列图:脚本执行后,会将代码检出到工程目录下的"WorkingArea/Code/project〞位置。注意:环境变量和类路径等内容的设置在更改ant脚本名称后会丧失,需要重新设置。3.3问题处理ant调用cvs网上文章较少,问题的处理就更少了,也许是太简单了吧,但我还是碰到了一些问题。首先,如果path路径中没有增加cvs路径,或者你没有安装cvs〔windows系统需要安装cvsnt〕,找不到cvs路径,将报错。所以保证命令行中任意路径下调用"cvs〞命令可以成功,如果还报错,可以将"path〞环境变量增加到eclipse中。另外,按照ant的cvs任务说明,cvs密码应该使用cvspass任务生成cvspass文件,在cvs任务中使用cvspass标签调用这个文件。但是,我在eclipse中这么做不会产生文件,同时cvscheckout会报告访问被拒绝〔很明白,没密码〕。处理方法就是将密码加在cvsroot属性中,在用户名后,"〞符号前增加":密码〞即可。4.javacjavac任务将刚刚检出的代码进展编译,编译后的代码放到bin目录下。4.1脚本javac局部的脚本如下:<targetname="javac"depends="checkoutsrc"><javacsrcdir="${srcdir}"destdir="${builddir}"source="1.6"><pilerargvalue="-*lint:unchecked"/></javac></target>其中,depends指定刚刚检出脚本,使脚本执行时先执行检出才会执行编译。source指定编译时使用的jdk版本,这里指定了1.6版本。由于代码编译需要,指定了一个编译参数"-*lint:unchecked〞,根据实际情况,可指定任何参数,可屡次使用,与命令行编译对应。在变量定义局部定义了两个变量:"srcdir〞指定源代码路径;"builddir〞指定编译后代码路径。脚本如下:<propertyname="projdir"value="D:/work/quality_workspace/AntScript"/><propertyname="srcdir"value="${projdir}/WorkingArea/Code/cginfo/src/main"/><propertyname="builddir"value="${projdir}/WorkingArea/Code/cginfo/bin"/>srcdir和builddir变量共同以当前工程目录为根底,所以,又定义了一个变量"projdir〞声明工程目录。4.2执行简单执行javac脚本可能会出现问题,需要使classpath包含类路径。同样,脚本上右键-"RunAs-"AntBuild…翻开窗口中选择Classpath页签,如下:这里要注意,只有选择"UserEntries〞节点时,添加jar包的按钮才有效。不知道是不是我使用的问题,AddFolders添加目录后,并不能把目录下所有jar包都添加到类路径来,只能将所有jar包摊在这里。编译后就是打包了,见下节。5.jar与javac同样,由于findbugs的需要,将javac编译后的代码打包5.1脚本<targetname="jar"depends="javac"><jardestfile="${packagedir}/app.jar"basedir="${builddir}"/></target>脚本destfile指定了编译后的jar包路径和文件名,basedir指定原代码的路径。这里在变量定义局部定义了变量packagedir用于指定jar包的路径,脚本如下:<propertyname="package"value="WorkingArea/Code/monMakeManage"/>执行后会在destfile位置找到打好的jar包。6.checkstyle终于进入正题了,准备工作完成,可以开场检查了,首先是checkstyle检查并且生成报告。6.1脚本检查脚本如下:<targetname="checkstyle"depends="jar"><taskdefresource="perties"/><checkstyleconfig="lib/check_rules.*ml"><formattertype="*ml"tofile="${checkstyledir}/checkstyle_report.*ml"/><filesetdir="${srcdir}"includes="**/*.java"/></checkstyle><stylein="${checkstyledir}/checkstyle_report.*ml"out="${checkstyledir}/checkstyle_report.html"style="lib/checkstyle-frames.*sl"/></target>脚本有点长,逐个讲解:首先,taskdef定义了checkstyle的anttask,以及声明了属性文件,这就需要ant的类路径中有checkstyle的jar包,这里我用的是checkstyle-5.4-all.jar。下面,checkstyle定义了检查的各方面,"config〞定义了检查规则,规则可以自定义编写,随后说明。formatter子元素定义了输出格式以及输出文件的位置,这里定义了*ml格式,同时定义了"checkstyledir〞变量,代表checkstyle报告目录。后面说明具体变量定义。fileset子元素定义了源代码位置,dir指定了源代码目录,includes指定文件类型,也可以使用e*cludes排除一些文件,详见checkstyle文档。执行后生成*ml报告文件,使用style标签结合checkstyle中自带的*sl文件将*ml生成html,便于查看,checkstyle自带了很多*sl文件,多尝试一下,看看哪个适合。注意:这里使用的是框架样式,生成的html,生成后有时会在"${checkstyledir}〞的同级目录生成files目录,目录中包含局部检查结果。6.2变量定义脚本如下:<propertyname="checkstyledir"value="${projdir}/checkstyle"/>6.3环境初始化脚本由于每次检查代码前要将之前的检查结果删除,保证结果是最新的。同时要保证文件目录存在,否则写报告时报错。所以有如下脚本:<targetname="delDir"><deletedir="${builddir}"/><deletedir="${checkstyledir}"/><deletedir="${findbugsdir}"/><deletedir="${cpddir}"/></target><targetname="mkDir"depends="delDir"><mkdirdir="${builddir}"/><mkdirdir="${checkstyledir}"/><mkdirdir="${findbugsdir}"/><mkdirdir="${cpddir}"/></target>这里将所有需要删除和建立的脚本都写出来了,包括编译的目录builddir;代码检查结果目录checkstyledir;bug检查结果目录findbugsdir以及代码重复检查目录cpddir。6.3执行脚本执行后会在checkstyledir目录下建立checkstyle_report.*ml和checkstyle_report.html文件6.4自定义规则checkstyle规则可以自定义,详细规则可以参考checkstyle文档,这里我只需要检查很少的规则,从checkstyle规则中删除不必要的规则,保存一局部需要的即可。规则如下:<"*mlversion="1.0""><!DOCTYPEmodulePUBLIC"-//PuppyCrawl//DTDCheckConfiguration1.3//EN"".puppycrawl./dtds/configuration_1_3.dtd"><!--Checkstyleconfigurationthatchecksthesuncodingconventionsfrom:-theJavaLanguageSpecificationatjava.sun./docs/books/jls/second_edition/html/inde*.html-theSunCodeConventionsatjava.sun./docs/codeconv/-theJavadocguidelinesatjava.sun./j2se/javadoc/writingdocments/inde*.html-theJDKApidocumentationjava.sun./j2se/docs/api/inde*.html-somebestpracticesCheckstyleisveryconfigurable.B(orinyourdownloadeddistribution).MostChecksareconfigurable,besuretoconsultthedocumentation.Topletelydisableacheck,justmentitoutordeleteitfromthefile.Finally,itisworthreadingthedocumentation.--><modulename="Checker"><!--Ifyousetthebasedirpropertybelow,thenallreportedfilenameswillberelativetothespecifieddirectory.S/5.*/config.html#Checker<propertyname="basedir"value="${basedir}"/>--><!--Checksthatpropertyfilescontainthesamekeys.--><!--S/config_misc.html#Translation--><modulename="Translation"/><modulename="TreeWalker"><!--ChecksforJavadocments.--><!--S/config_javadoc.html--><modulename="JavadocMethod"/><modulename="JavadocType"/><modulename="JavadocVariable"/><!--ChecksforNamingConventions.--><!--S/config_naming.html--><modulename="ConstantName"/><modulename="LocalFinalVariableName"/><modulename="LocalVariableName"/><modulename="MemberName"/><modulename="MethodName"/><modulename="PackageName"/><modulename="ParameterName"/><modulename="StaticVariableName"/><modulename="TypeName"/><!--ChecksforHeaders--><!--S/config_header.html--><!--<modulename="Header">--><!--Thefollowpropertyvaluedemonstratestheability--><!--tohaveaccesstoANTproperties.Inthiscaseituses--><!--the${basedir}propertytoallowCheckstyletoberun--><!--fromanydirectorywithinaproject.Seeproperty--><!--e*pansion,--><!--/config.html#properties--><!--<property--><!--name="headerFile"--><!--value="${basedir}/java.header"/>--><!--</module>--><!--Followinginterpretstheheaderfileasregulare*pressions.--><!--<modulename="Rege*pHeader"/>--><!--Checksforimports--><!--S/config_import.html--><modulename="AvoidStarImport"/><modulename="IllegalImport"/><!--defaultstosun.*packages--><modulename="RedundantImport"/><modulename="UnusedImports"/><!--Checksformoncodingproblems--><!--S/config_coding.html--><modulename="SimplifyBooleanE*pression"/><modulename="SimplifyBooleanReturn"/></module></module>7.findbugs使用findbugs检查常见bug7.1脚本脚本如下:<targetname="findbugs"depends="checkstyle"><taskdefname="findbugs"classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/><findbugshome="${findbugs.home}"output="html"outputFile="${findbugsdir}/findbugs_report.html"><sourcePathpath="${srcdir}"/><classlocation="${projdir}/WorkingArea/Code/cginfo/app.jar"/></findbugs></target>同样,taskdef定义了findbugs的anttask,需要classpath中增加findbugs的jar包。一个findbugs-ant.jar根本就够了。findbugs标签,home指定findbug安装目录。output定义输出样式,一般输出html形式,*ml形式也可,但*ml形式再用样式转html总是显示不了bug,没仔细查问题发生在哪里。outputFile指定报告的路径和文件名。sourcePath指定源代码目录class指定jar包的目录和文件名。7.2执行执行后查看报告即可。但findbugs生成的报告与findbugseclipse插件检查的结果有些出入,没有查看具体问题发生在哪里。8.cpdcpd是pmd的一个组件,用来检查重复代码。8.1脚本脚本如下:<targetname="pmdcpd"depends="findbugs"><taskdefname="cpd"classname="net.sourceforge.pmd.cpd.CPDTask"/><cpdminimumTokenCount="100"encoding="UTF-8"format="*ml"outputFile="${cpddir}/cpd.*ml"><filesetdir="${srcdir}"><includename="**/*.java"/></fileset></cpd></target>taskdef定义了cpd的ant任务,这与pmd任务是分开的。classpath中需要增加pmd解压目录的lib目录下的所有jar包。cpd标签的minimumTokenCount指定了最小重复行数,当重复函数大于这个量时产生报告。encoding指定文件编码。format指定输出文件格式。outputFile指定输出文件路径和文件名称。include指定检查的文件。可以使用e*clude指定剔除的文件。8.2执行执行后查看输出文件,虽然是*ml格式,但使用IE翻开很容易查看,由于只能使用*slt结合*ml形式生成html,且初步试验,生成html文件有点问题,就放弃了。9.完整脚本完整脚本如下:<"*mlversion="1.0"encoding="utf-8""><projectname="myProject"default="start"><!--变量定义--><propertyname="cvsroot"value=":pserver:wangjian*uan:passwordscm1.domain.:/repository/opermanage"/><propertyname="projdir"value="D:/work/quality_workspace/AntScript"/><propertyname="srcdir"value="${projdir}/WorkingArea/Code/cginfo/src/main"/><propertyname="builddir"value="${projdir}/WorkingArea/Code/cginfo/bin"/><propertyname="checkstyledir"value="${projdir}/checkstyle"/><propertyname="findbugsdir"value="${projdir}/findbugs"/><propertyname="findbugs.home"value="D:/work/quality_workspace/findbugs-"/><propertyname="cpddir"value="${projdir}/cpd"/><!--init--><targetname="delDir"><deletedir="${builddir}"/><deletedir="${checkstyledir}"/><deletedir="${findbugsdir}"/><deletedir="${cpddir}"/></target><targetname="mkDir"depends="delDir"><mkdirdir="${builddir}"/><mkdirdir="${checkstyledir}"/><mkdirdir="${findbugsdir}"/><mkdirdir="${cpddir}"/></target><!--checkout--><targetname="checkoutlib"depends="mkDir"><cvscvsroot="${cvsroot}"package="WorkingArea/Code/lib"/></target><targetname="checkoutsrc"depends="checkoutlib"><cvscvsroot="${cvsroot}"package="WorkingArea/Code/cginfo"/></target><!--javac--><targetna
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年洛阳市文学艺术界联合会下属事业单位招才引智引进工作人员4名参考题库附答案
- 受试者补偿方案一致性审查
- 双抗规模化生产:技术挑战与解决方案
- 2026年中级银行从业资格之中级公司信贷考试题库300道含答案(夺分金卷)
- 2026年一级注册建筑师之建筑结构考试题库300道附参考答案【培优a卷】
- 2026年天津市单招职业适应性考试题库附答案
- 2025河南能才百事通信息技术有限公司选聘6人模拟试卷附答案
- 2025河南驻马店市县区事业单位招聘联考(新蔡县)153人参考题库附答案
- 2026年一级建造师之一建矿业工程实务考试题库300道及答案【全优】
- 2026年一级注册建筑师之建筑结构考试题库300道附完整答案(夺冠系列)
- 初三语文下册课文威尼斯商人原文
- YS/T 668-2008铜及铜合金理化检测取样方法
- GB/T 260-2016石油产品水含量的测定蒸馏法
- GB/T 19362.1-2003龙门铣床检验条件精度检验第1部分:固定式龙门铣床
- AQ安全资料管理规程(北京市)课件
- 立体车库技术参数及要求
- 青春期教育 完整版课件
- 介电性能精品课件
- 初中数学沪科版九下 随机事件部优课件
- DB11T 716-2019 穿越既有道路设施工程技术要求
- 【疯狂动物城】超精致卡通电影主题通用模板
评论
0/150
提交评论