使用过spotbugs的同学一定会有下面这两个疑问!!!
我不想对所有的代码规则都进行校验该如何处理?
我不想对所有的类都进行校验该如何处理?
今天就向大家介绍spotbugs的过滤器,然后解决上面这两个问题。
spotbugs过滤器
从概念上讲,过滤器根据一组标准匹配bug实例。通过定义过滤器,您可以选择bug实例进行特殊处理;例如,在报告中排除或包括它们。 过滤器文件是一个带有顶级FindBugsFilter元素的XML文档,该元素有一定数量的Match元素作为子元素。每个Match元素代表一个应用于生成的错误实例的谓词。通常,过滤器将用于排除bug实例。例如:
spotbugs -textui -exclude myExcludeFilter.xml myApp.jar
我们也可以使用过滤器来选择要特别报告的bug实例:
spotbugs -textui -include myIncludeFilter.xml myApp.jar
过滤器字段中的含义
myExcludeFilter.xml 或者 myIncludeFilter.xml是需要遵循一定的编写规则的,在这里就来介绍一下具体的规则
给大家举两个经典的例子
实例1
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Class name="com.example.demo.MyClass />
<Bug category="PERFORMANCE" />
</Match>
</FindBugsFilter>
上面的例子就是只对com.example.demo.MyClass 进行PERFORMANCE类型所包括的所有37种规则进行代码检查
PERFORMANCE 类型具体的规则如下:
https://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#performance-performance
实例2
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Bug pattern="SQL_INJECTION"/>
</Match>
<Match>
<Bug pattern="XSS_REQUEST_WRAPPER"/>
</Match>
</FindBugsFilter>
上面的例子对所有工程中的类进行SQL_INJECTION和XSS_REQUEST_WRAPPER两种类型的代码检查
下面就具体的介绍一下规则xml标签的具体含义
<FindBugsFilter>
xml文件中开头结尾必须的元素标签
<Bug>
指定了一个特定的bug类型,可以与category和pattern一起使用
<Package>
此元素匹配与特定包关联的警告,使用name属性。
<Class>
此元素匹配与特定类关联的警告,使用name属性。
<Source>
此元素匹配与特定源文件关联的警告,使用name属性。
<Method>
此元素匹配与特定方法关联的警告,使用name,returns,params属性。例如:
<Method name="frob" params="int,java.lang.String" returns="void" />
<Field>
此元素指定类中的一个字段(成员变量),使用name属性。
<Local>
此元素指方法内部局部变量,使用name属性。
<Type>
<Confidence>
此元素将警告与特定的bug重要级别相匹配。value属性应该是一个整数值:1匹配高级别警告,2匹配正常级别警告,3匹配低级别警告。<Confidence>在<Priority>2.0.0版本中替换
<Priority>
参考<Confidence>
<Rank>
此元素匹配至少具有指定错误等级的警告。value属性应该是1到20之间的整数值,其中1到4是最可怕的,5到9是可怕的,10到14是麻烦的,15到20是值得关注的bug。与<Confidence>和<Priority>功能类似
<Or>
此元素将Match子句组合为OR语句。也就是说,匹配其中一个子句即可。
<And>
这个元素组合了Match子句组合为and语句,所有子句都匹配。
<Not>
此元素反转包含的子Match。也就是说,你可以在Not子句中放入一个Bug元素,以匹配除给定bug之外的任何bug。
过滤器中正则的应用
如果描述符以~字符开头,则其余属性内容将被解释为Java正则表达式。例如有三个包
com.example.demo1
com.example.demo2
com.test.demo1
想要测试com.example.demo1和com.example.demo2两个包中的类,编写如下代码即可
<Package name="~com\.example\.demo.*" />
Maven中关于filter文件的配置
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.5.3.0</version>
<configuration>
<includeFilterFile>myfilter-include.xml</includeFilterFile>
</configuration>
</plugin>
我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!