findBugs 在eclispe中的使用

(1)
findbugs是一个开源的eclipse 代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患。针对各种问题,它并且提供了简单的修改意见供我们重构时进行参考; 通过使用它,可以一定程度上降低我们code review的工作量,并且会提高review效率。 通过findbugs找到bug,再由我们自己重构代码,可以培养我们的编码意识及水平,形成好的习惯提高开发编码能力。

Findbugs与PMD,checkStyle的区别:
Findbugs主要着眼于寻找代码中的缺陷,这就与其他类似工具有些区别了,比如说Checkstyle和PMD就是根据样式(style)来改进代码质量的。FindBugs分析引擎与Checkstyle和PMD也有所不同,因为它直接操作类文件(class文件)而不是源代码。

(2)
在eclipse中安装findbug插件:
下载地址:
http://downloads.sourceforge.net/project/findbugs/findbugs%20eclipse%20plugin/1.3.9/edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zip?use_mirror=ncu

1,把下载的压缩包解压后,把plugin包copy到eclipse的plugin目录中去;
2,重新启动eclipse
3,打开eclipse->window->Preferences,搜索关键字findbugs,如果能找到配置项,那么表示安装成功,如下图.
(3)
findbugs 简单易用,按照下图操作即可: 选择指定的包或者类进行findbug.
此时findbugs会遍历指定的包或者类,进行分析,找出代码bug,然后集中显示在 find bugs 的bugs explorer 中,下面我们添加bugs explorer。
bugs explorer 添加完毕后,我们就可以查看刚刚找到的bugs了,如下图.

找出的bug有3中颜色, 黑色的臭虫标志是分类, 红色的臭虫表示严重bug发现后必须修改代码,橘黄色的臭虫表示潜在警告性bug 尽量修改。(附录是各种bug的解释及修改方案,请大家按附表参考修改)
双击bug项目就可以在右边编辑窗口自动打开相关代码文件并连接到代码片段。 点击行号旁边的小臭虫图标后再eclipse下方输出区将提供详细的bug描述,以及修改建议等信息。我们可以根据此信息进行修改。
(4)
ant中使用findBugs:
http://findbugs.sourceforge.net/downloads.html下载最新版本的Findbugs,目前的版本是1.3.0, 于2007年11
月8日发布。把解压后目录复制到项目的lib目录下,然后就可以和Ant配合使用了。FindBugs工作在j2se1.4.0或以
后的版本中,需要至少256MB内存。
8.1
在Ant脚本中,首先定义Findbugs的解压目录位置:
<path id="findbugs.path" >
     <fileset  dir ="${lib.home}/findbugs-1.3.0">
        <include  name ="**/*.jar"/>
     </fileset>
</path>
8.2
接着声明Findbugs任务:
<taskdef name="findbugs" classpathref="findbug.path"
classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
8.3
建立任务:
<target name="findbug" depends="zip"> 
  <delete dir="${findbugs.result}" />
  <mkdir dir="${findbugs.result}" />
  <findbugs home="${findbugs.path}" output="xml:withMessages" outputFile="${findbugs.result}\bug.xml"
jvmargs="-Xmx1000m" timeout="6000000"> 
<!--  以下定义findbugs查找的类路径  -->
<class location="F:\CruiseControl\projects\DM_Management_Console\assemble\dm.war.zip"></class>
<!--  以下定义源代码的路径  -->
<sourcePath path="F:\CruiseControl\projects\DM_Management_Console"></sourcePath>
<!--  以下定义上述类所依赖的类路径  -->
   <auxClasspath> 
    <fileset dir="${webapp}\lib"> 
     <include name="*.jar" /> 
    </fileset>
   </auxClasspath>
  </findbugs> 
</target>
自己做的实例分析:
                <property name="findbugs.path" value="${webapp.test.libpath}\findbugs-1.3.9"/>        
                <property name="findbugs.result" value="${webapp.checkCodesResult}\findbugs"/>        
                <path id="findbug.path">                
                                <fileset dir="${findbugs.path}">        
                                     <include name="*.jar" />                
                                </fileset>                
                </path>        
                <!--定义findBugs任务-->        
                <taskdef name="findbugs" classpathref="findbug.path"        
classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />        
                <!-- 定义将xml文件转换为html任务 -->        
                <taskdef name="convertXmlToText"        
classname="edu.umd.cs.findbugs.anttask.ConvertXmlToTextTask">        
                                <classpath refid="findbug.path" />        
                </taskdef>        
                        
                <target name="findbug">                
                                <delete dir="${findbugs.result}" />        
                                <mkdir dir="${findbugs.result}" />        
                                <findbugs home="${findbugs.path}" output="xml:withMessages"        
outputFile="${findbugs.result}/bug.xml" jvmargs="-Xmx1000m" timeout="6000000">                
                                     <class location="${webapp.assemble}\dm.war\WEB-INF\classes"></class>                

                                     <sourcePath path="${webapp.java}"></sourcePath>        

                                                <auxClasspath>                
                                                            <fileset dir="${webapp.lib}">        
                                                                  <include name="*.jar" />                
                                                             </fileset>        
                                                             <fileset dir="${servlet.lib}">        
                                                                   <include name="*.jar" />                
                                                              </fileset>        
                                                </auxClasspath>        
                                </findbugs>                
                                <!-- 将xml转换为html -->        
                    <convertXmlToText home="${findbugs.path}" input="${findbugs.result}\bug.xml"   output="${findbugs.result}\findbugs.html" format="html:default.xsl" />        
                </target>        
分析:        
home:定义了findbug所有的lib包位置;        
output:定义了findbug的输出文件类型;        
outputFile:输出文件的位置名称;        
jvmargs:设置findbugs运行参数;        
class: -->important        
设置findbug要检测的代码的class文件位置.FindBugs分析引擎与Checkstyle和PMD也有所不同,因为它直接操作类

文件(class文件)而不是源代码。此属性一定要写!!!        
注意:        
设置此路径是,对项目中非检测class的文件(如:系统依赖的jar包),不要包括在此class路径中.否则,findbug也会对jar中的内容进行检测,便检测时间变长很多;导易导致out of menery.        
如:        
若<class location="${webapp.assemble}\dm.war.zip"></class>,class会指向当前项目的所有文件.则当前项目依赖的jar包,如struts2-core.jar都会被findbug. 检测完当前项目须7 min 34 sec        
若正确设置<class location="${webapp.assemble}\dm.war\WEB-INF\classes" />,则只须10 sec即可.        

sourcePath: -->important        
定义检测class文件的源码.为可选项.不写也不会影响findbug结果.若指定目录,使 FindBugs 可以在 GUI 中查看   

XML 结果时突出显示出错的源代码。        

auxClasspath: -->important        
设置当前项目所需的依赖包,否则会出现missing class.       
(5)
在生成的html report中,点击每一条bug,可下拉查看当前bug的详细信息.

(6)
使用过滤器
使用过滤器我们就可以定义使用哪些bug检测器和针对哪些类进行检查,因为一旦项目比较庞大,那查看冗长的bug
报告也是十分痛苦的事情。使用过滤器,过滤器用来包含或排除特殊的bug报告。这样做有助于在特定的时间段内,
聚焦我们的关注点。过滤器实际是在一个xml文件定义的,xml配置文件的内容如下:
<FindBugsFilter>
     <!--  该类使用所有的bug检测器  -->
     <Match>
       <Class name="com.foobar.MyClass" />
     </Match>  
     <!--  该类使用bugcode为HE的检测器  -->
     <Match class ="com.foobar.BClass">
         <BugCode  name ="HE"/>
     </Match>
     <!--  该类通过指定缩写名使用一些bug检测器  -->
     <Match>
       <Class name="com.foobar.MyClass"/ >
       <Bug code="DE,UrF,SIC" />
     </Match>
</FindBugsFilter>
在findBugs定义属性时,加上相应的过滤器,如下:
<findbugs home ="${findbugs.home}" includeFilter="${findbugs_include_filter}"
excludeFilter="${findbugs_exclude_filter}" ...>
具体可参考:
http://hulongzhou.blog.hexun.com/33024717_d.html
(7)
findBugs出现过的问题:
java.lang.OutOfMemoryError: requested 40960 bytes for GrET in C:\BUILD_AREA\jdk6_10\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?
解决方法:
swap space问题.--虚拟内存设置不足或没设置的问题.
我的电脑-->属性-->高级-->性能-->设置-->高级-->虚拟内存设置.
当运行ant findbug时,可以双击找开:
C:\Program Files\Java\jdk1.6.0_10\bin\jconsole.jar.
可以点击里面检测到的"ant","findbug"线程,查看各自占用的资源.
说明:
findbug是比较会占用资源的.
调高可用资源大小,有三方面:
第一,调高findbug参数:在build.xml中有:
<findbugs home="${findbugs.path}" output="xml:withMessages" outputFile="${findbugs.result}/bug.xml"
jvmargs="-Xmx1000m" timeout="6000000">
第二,调高ant的大小:
在"环境变量"中,添加:ANT_OPTS=-Xms256m -Xmx1024m
第三,调高CC的大小:
在cruiseControl.bat中调高配置,如: set CC_OPTS=-Xms256m -Xmx1024m

你可能感兴趣的:(findbugs)