FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式(请参阅 参考资料)。图 1 显示了分析一个匿名项目的结果(为防止可怕的犯罪,这里不给出它的名字):
在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上,这样便可以从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉以发现一些更深层的bug。
选定了以上各项后,便可以开始检测了。检测的过程可能会花好几分钟,具体视工程的规模而定。检测完毕可生成一份详细的报告,藉由这份报告,可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的(classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。
项目采用maven构建,想使用findbugs-maven-plugin 插件进行代码静态分析
官网:http://findbugs.sourceforge.net/
a program which uses static analysis to look for bugs in Java code
最下面的文件就是maven 的配置文件pom.xml,类似于ant的build.xml文件,pom.xml内容如下:
Xml代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hubin</groupId> <artifactId>uvm-agent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>uvm-agent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies> <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>2.5.2</version> </plugin> </plugins> </reporting> </project>
此时target目录是空的。打开cmd,进入项目所在目录,运行mvn findbugs:findbugs
运行结果如下:
从上图(mvn findbugs:findbugs的运行结果) 来看,maven 并没有运行findbugs,为什么会这样呢?
我们看看findbugs官网是如何说明的:
FindBugs requires JRE (or JDK) 1.5.0 or later to run. However, it can analyze programs compiled for any version of Java, from 1.0 to 1.8. The current version of FindBugs is 2.0.2, released on 10:49:15 EST, 10 December, 2012. We are very interested in getting feedback on how to improve FindBugs. File bug reports onour sourceforge bug tracker
findbugs虽然是一个静态分析工具,但是它分析的不是java源代码(后缀名为.java),而是class文件(编译后的文件)。在运行mvn findbugs:findbugs 时,不会自动编译项目,即没有class文件,所以findbugs没有运行。
有的技术博客说:“clean findbugs:findbugs install ,这种写法是错的,可以运行的,但是并不产生findbugs报告”,说法是对的,但是并没有说明原因。
原因:运行clean后,class文件都被删除了,所以不会运行findbugs,或者说findbugs没有可分析的class文件,自然就没有产生分析结果。
使用maven运行findbugs前一定先编译,一定要有class文件!
解决方法:
(1)mvn clean compile findbugs:findbugs
(2)mvn clean test findbugs:findbugs (test会调用compile生命周期)
如下图:
运行完之后,target目录会增加如下文件:findbugsXml.xml
测试结果是xml格式的,不方便查看、展示.
我们希望以html格式来展示findbugs的运行结果(报告),如下图:
如上图所示,如何实现html展示findbugs报告呢?
如何让findbugs产生html格式的分析报告呢?
关于如何在maven中配置findbugs插件,请参阅我的上一篇日志(http://hw1287789687.iteye.com/blog/1960322)。
运行mvn compile findbugs:findbugs 产生的分析报告默认是xml,非常不方便查看,因为不直观。
如何让findbugs的分析报告清晰、一目了然呢?
要想产生html,必须使用mvn site,The <reporting>
usage is for mvn site
第一步:pom.xml使用reporting 标签,把findbugs-maven-plugin 插件放在reporting标签里面
Xml代码
<reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>2.5.2</version> </plugin> </plugins> </reporting>
第二步:运行 mvn compile site
第三步:使用浏览器打开project-reports.html
点击超链接FindBugs Report,进入findbugs 分析报告: