如何用SpotBugs更快分析

1,463 阅读2分钟

SpotBugs是一个分析class文件的工具。SpotBugs可以分析Java LTS版本编译的class文件。SpotBugs不擅长处理lambda函数和参数化类型,但它对Java开发仍有帮助。

spotbugs_logo_600px.png

SpotBugs的一个众所周知的问题是其性能。SpotBugs仍然是单线程,所以你可能需要等待很长时间,即使你的机器有很多CPU核心。但是为了提高开发人员的生产力和代码质量,我们要加速持续集成。那怎么用SpotBugs快速分析?我知道两个方法:

1. 只用其实需要的检测器

SpotBugs有好多检测器(Detector)。默认情况下,SpotBugs使用其中的大部分来分析类文。这是很有用的,因为即使不深入了解SpotBugs,Java程序员也能写出更多安全代码。

但如果你有动力加速你的构建,默认配置就不适合了。它用太多检测器,所以你要用 -visitors 命令列选项或者 visitors 属性来限制你想启用的探测器。

那怎么决定你想要用的检测器?一个简单方法是查检测器列表看为你的开发有用的检测器。在默认配置下用spotbugs来分析一次,然后你会发现项目中存在哪些错误类型(Bug Pattern)。在检测器列表中,你可以找到哪个检测器报告了哪种错误类型,所以你可以列出哪个检测器对你的项目有用。

请注意,SpotBugs还提供了可以限制报告问题的过滤器(Filter)。但过滤器不能加速分析,因为它在分析之后发挥作用。

2.只分析你写的class文件

SpotBugs分析的时候它需要class文件和jar文件的文件路径,所以有两种方法来指定它们的路径。你用Gradle或者Maven的话没问题,但你用CLI分析的话你需要了解如何以不同方式使用。

第一是application classpath。你可以用命令行参数来设置。SpotBugs分析application classpath里的class文件和jar文件。第二是non-application classpath,也被称为辅助(auxiliary)classpath。你可以用 -auxClasspath 命令行选项来设置。从辅助classpath中,spotbugs获得了额外的数据用于分析。

所以别用classpath设置框架的jar文件,因为SpotBugs一般不需要分析框架的代码。用辅助classpath代替。

有的时候 -onlyAnalyze 命令行选项也是有用的,你可以限制哪个package和class需要分析。