FindBugs filter 编写过滤文件配置
使用FindBug对项目的代码进行了检查
从官方的说明中得到了启发。官网链接如下:
http://findbugs.sourceforge.net/manual/filter.html
在这个链接了它讲解了FindBug的filter使用:
将相应的规则作成一份 XML 文档,然后,在配置页面中导入这份配置文档即可。
做一份xml
findbugs_exclude_package.xml
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Package name="~com\.ceair\.hotel\.order\.model.*"/>
</Match>
<Match>
<Method name="main"/>
</Match>
<Match>
<Source name="~.*\.scala"/>
</Match>
<Match>
<Class name="~.*\.*Test"/>
</Match>
</FindBugsFilter>
导入

再次运行FindBug,果然,不出所料,所有的scala 文件被排除了
扩展
1.过滤文件简介
从概念上讲,过滤器将针对一组条件的错误实例进行匹配。通过定义过滤器,您可以选择错误实例进行特殊处理; 例如,将其排除或包含在报告中。
过滤器文件是具有顶级元素的XML文档,FindBugsFilter
其中有一些Match
元素作为子元素。每个Match
元素表示一个应用于生成的bug实例的谓词。通常,将使用过滤器来排除错误实例。例如:
$ findbugs -textui -exclude myExcludeFilter.xml myApp.jar
但是,也可以使用筛选器来选择错误实例来专门报告:
$findbugs -textui -include myIncludeFilter.xml myApp.jar
Match
元素包含子句,它们是谓词的连接词。换句话说,每个孩子必须对谓词是真实的。
2.匹配条款的类型
此元素指定要匹配的特定错误模式。该pattern
属性是以逗号分隔的错误模式类型列表。您可以通过查看-xml 输出选项( 元素的type
属性BugInstance
)或错误描述文档生成的输出来查找特定警告的错误模式类型。
要进行更粗粒度的匹配,请使用code
属性。它需要以逗号分隔的bug缩写列表。对于大多数粗粒匹配使用 category
attriute,即需要bug目录名称的逗号分隔的列表: CORRECTNESS
,MT_CORRECTNESS
, BAD_PRACTICICE
,PERFORMANCE
,STYLE
。
如果在同一<Bug>
元素上指定了上述多个属性,则将 匹配与指定模式名称或缩写或类别之一匹配的所有错误模式。
作为向后兼容的措施,<BugPattern>
并且 <BugCode>
元件可以被用来代替 <Bug>
元素。其中每个都使用一个 name
属性来指定接受的值列表。在将来的版本中可能会删除对这些元素的支持。
此元素匹配具有特定错误信心的警告。该value
属性应为整数值:1表示高置信度警告,2表示匹配正常置信度警告,3表示匹配低置信度警告。<Confidence>在2.0.0版本中替换了<Priority>。
相同<Confidence>
,为了向后兼容而存在。
此元素匹配具有特定错误等级的警告。该value
属性应该是1到20之间的整数值,其中1到4是最可怕的,5到9个可怕的,10到14个令人烦恼的,以及15到20个涉及错误的。
此元素匹配与使用name
attribute 指定的包中的类关联的警告。不包括嵌套包(沿着Java import语句行)。但是,使用正则表达式名称匹配可以轻松实现匹配多个包。
此元素匹配与特定类关联的警告。该 name
属性用于指定类名的精确或正则表达式匹配模式。该role
属性是类角色。
作为向后兼容性度量,您可以使用元素class
上的属性Match
来指定正确的类名称或classregex
属性,以指定与类名称匹配的正则表达式,而不是此类型 的元素。
如果Match
元素既不包含Class
元素也不包含class
/ classregex
属性,则谓词将应用于所有类。这样的谓词可能会匹配比您想要的更多的bug实例,除非使用适当的方法或字段谓词进一步细化。
此元素匹配与特定源文件关联的警告。该 name
属性用于指定源文件名的精确或正则表达式匹配模式。
此元素指定方法。的name
用于指定对方法名的确切或正则表达式匹配的图案。该params
属性是以逗号分隔的方法参数类型列表。该returns
属性是方法的返回类型。该role
属性是方法角色。在params
和中returns
,类名必须是完全限定的。(例如,“java.lang.String”而不仅仅是“String”。)如果指定了后一个属性之一,则创建方法签名需要另一个属性。请注意,您可以提供两种name
属性或者params
与returns
属性或他们三个。这样您就可以提供各种基于名称和签名的匹配。
该元素指定一个字段。该name
属性用于指定字段名称的精确或正则表达式匹配模式。您还可以根据其签名 - 使用type
属性过滤字段以指定字段的完全限定类型。您可以指定eiter或这两个属性以执行基于名称/签名的匹配。该role
属性是字段角色。
这个元素指定一个局部变量。该name
属性用于指定局部变量名称的精确或正则表达式匹配模式。局部变量是在方法中定义的变量。
该元素将Match
子句合并为分离符。也就是说,您可以将两个 Method
元素放在一个Or
子句中以匹配任一方法。
这个元素结合Match
了必须评估为真的子句。即,您可以在子句中放置 Bug
和Confidence
元素,And
以便仅在给定的置信度下匹配特定的错误。
<Bug>
<Confidence>
<Priority>
<Rank>
<Package>
<Class>
<Source>
<Method>
<Field>
<Local>
<Or>
<And>
<Not>
这个元素颠倒了包含的孩子Match
。即,您可以Bug
在Not
子句中放置一个 元素,以匹配排除给定的一个错误。
3. Java元素名称匹配
如果name
属性Class
,Source
, Method
或Field
用〜字符的属性内容的其余部分被解释为是对有问题的Java元素的名称相匹配的Java正则表达式开始。
请注意,该模式与整个元素名称匹配,因此需要在模式开始和/或结束时使用。*子句来执行子字符串匹配。
请参阅java.util.regex.Pattern
模式语法的文档。
警告
Match
子句只能匹配实际包含在bug实例中的信息。每个bug实例都有一个类,所以通常情况下,按类排除错误将起作用。
一些bug实例有两个(或更多)类。例如,DE(丢弃的异常)错误会报告包含发生已删除异常的方法的类以及表示已丢弃异常的类型的类。只有第一个(主要)类与Match
子句匹配。因此,例如,如果要抑制类“com.foobar.A”和“com.foobar.B”的IC(初始化循环)报告,则可以使用两个Match
子句:
<Match>
<Class name =“com.foobar.A”/>
<Bug code =“IC”/>
</ Match>
<Match>
<Class name =“com.foobar.B”/>
<Bug code =“ IC“/>
</ Match>
通过明确地匹配两个类,确保无论在循环中涉及的哪个类恰好在bug实例中首先列出,都可以确保IC bug的实例匹配。(当然,这种方法可能会意外地压制包含“com.foobar.A”或“com.foobar.B”和第三类的循环。)
许多类型的错误报告了它们出现的方法。对于这些错误实例,可以将Method
子句放在Match
元素中,并且它们应该按预期工作。
5.例子
1.匹配课程的所有错误报告。
<Match>
<Class name="com.foobar.MyClass" />
</Match>
2.通过指定他们的缩写来匹配某个班级的某些考试。
<Match>
<Class name="com.foobar.MyClass"/ >
<Bug code="DE,UrF,SIC" />
</Match>
3.通过指定缩写来匹配所有类别的某些测试。
<Match>
<Bug code="DE,UrF,SIC" />
</Match>
4.通过指定类别来匹配所有类的某些测试。
<Match>
<Bug category="PERFORMANCE" />
</Match>
5.通过它们的缩写匹配一个类的指定方法中的错误类型。
<Match>
<Class name="com.foobar.MyClass" />
<Or>
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
6.匹配特定方法中的特定错误模式。
<!-- A method with an open stream false positive. -->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="writeDataToFile" />
<Bug pattern="OS_OPEN_STREAM" />
</Match>
7.以特定的方法将特定的错误模式与给定的优先级进行匹配。
<!-- A method with a dead local store false positive (medium priority). -->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
8.匹配由AspectJ编译器引入的小错误(除非您是AspectJ开发人员,否则您可能对这些错误不感兴趣)。
<Match>
<Class name="~.*\$AjcClosure\d+" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Method name="run" />
</Match>
<Match>
<Bug pattern="UUF_UNUSED_FIELD" />
<Field name="~ajc\$.*" />
</Match>
9.在代码库的特定部分中匹配错误
<!-- match unused fields warnings in Messages classes in all packages -->
<Match>
<Class name="~.*\.Messages" />
<Bug code="UUF" />
</Match>
<!-- match mutable statics warnings in all internal packages -->
<Match>
<Package name="~.*\.internal" />
<Bug code="MS" />
</Match>
<!-- match anonymoous inner classes warnings in ui package hierarchy -->
<Match>
<Package name="~com\.foobar\.fooproject\.ui.*" />
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
</Match>
10.使用特定签名匹配字段或方法上的错误
<!-- match System.exit(...) usage warnings in void main(String[]) methods in all classes -->
<Match>
<Method returns="void" name="main" params="java.lang.String[]" />
<Bug pattern="DM_EXIT" />
</Match>
<!-- match UuF warnings on fields of type com.foobar.DebugInfo on all classes -->
<Match>
<Field type="com.foobar.DebugInfo" />
<Bug code="UuF" />
</Match>
11.使用Not过滤器运算符来匹配错误
<!-- ignore all bugs in test classes, except for those bugs specifically relating to JUnit tests -->
<!-- i.e. filter bug if ( classIsJUnitTest && ! bugIsRelatedToJUnit ) -->
<Match>
<!-- the Match filter is equivalent to a logical 'And' -->
<Class name="~.*\.*Test" />
<!-- test classes are suffixed by 'Test' -->
<Not>
<Bug code="IJU" /> <!-- 'IJU' is the code for bugs related to JUnit test code -->
</Not>
</Match>
12.完全排除过滤器文件,以匹配从Groovy源文件生成的所有类。
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Source name="~.*\.groovy" />
</Match>
</FindBugsFilter>
6.完整的例子
<FindBugsFilter>
<Match>
<Class name="com.foobar.ClassNotToBeAnalyzed" />
</Match>
<Match>
<Class name="com.foobar.ClassWithSomeBugsMatched" />
<Bug code="DE,UrF,SIC" />
</Match>
<!-- Match all XYZ violations. -->
<Match>
<Bug code="XYZ" />
</Match>
<!-- Match all doublecheck violations in these methods of "AnotherClass". -->
<Match>
<Class name="com.foobar.AnotherClass" />
<Or>
<Method name="nonOverloadedMethod" />
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
<!-- A method with a dead local store false positive (medium priority). -->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
<!-- All bugs in test classes, except for JUnit-specific bugs -->
<Match>
<Class name="~.*\.*Test" />
<Not>
<Bug code="IJU" />
</Not>
</Match>
</FindBugsFilter>