FindBugs的问题排除过滤器

时间:2009-07-02 10:34:24

标签: java findbugs

我正在评估FindBugs,并且我正在尝试使用excludeFilter,以便该工具不会处理测试包或生成的ejb存根。

我尝试了以下内容:

<FindBugsFilter>
<!-- Match any test packages -->
<Match>
    <Package name="~.*\.test"/>
</Match>
<Match>
    <Or>
        <Class name="~.*\.^_*"/>
        <Class name="~.*EJS*"/>
    </Or>
    <Bug pattern="MALICIOUS_CODE"/>
</Match>

仍在查看生成的EJB。有人可以为此提供更好的指导。

我想排除所有以“_”

开头的类

示例:

COM / myCompany的/商业/管理/ EJB / _AdminRemoteHome_Stub.java

COM / myCompany的/商业/管理/ EJB / _EJSRemoteStatelessAdminHome_054d51b9_Tie.java

更新过滤器文件。

我使用建议的regx更改将过滤器文件更改为以下结构,现在事情按预期工作:

<FindBugsFilter>
<!-- Match any test packages -->
<Match>
    <Package name="~.*\.test"/>
</Match>
<Match>
    <Class name="~.*\._.*"/>
</Match>
<Match>
    <Class name="~.*?EJS.*"/>       
</Match>

看起来我需要回去查看我的regx。

3 个答案:

答案 0 :(得分:7)

关于FindBugFilter

(只是为了确定)你确定你正在考虑编译的类文件目录,而不是sourcePath? (如本SO answer中所述)。

来自Java element name matching部分:

  

如果Class,Method或Field的name属性以〜字符开头,则其余属性内容将被解释为与所讨论的Java元素的名称匹配的 Java正则表达式

以下正则表达式会更准确吗?

    <Class name="~.*\._.*"/>
    <Class name="~.*?EJS.*"/>
  • .*\._.*”而不是“.*\.^_*”,因为anchor应该在应用正则表达式模式的字符串的开头匹配。

  • .*?EJS.*”而不是“.*EJS*”,因为? quantifier会使匹配变得懒惰,避免“吃掉”EJS。 (加上“S*”表示“0或n S”,这对此没有帮助)

答案 1 :(得分:1)

我的findbugs排除文件无法正常工作。我使用的是findbugs-maven-plugin v3.0.0。为了解决这个问题,我运行了一个生成findbugsXml.xml的构建,然后发出了:

mvn findbugs:gui

这会启动findbugs的用户界面。然后我加载了findbugsXml.xml文件,导航到我想要排除的警告,排除它们,然后将排除项保存到findbugs_exclude.xml。我将此添加到maven插件中

<excludeFilterFile>findbugs_exclude.xml</excludeFilterFile>

生成的文件正常工作,并且在findbugs报告中真正省略了排除项。

我为maven插件找到的另一个重要提示是添加:

<omitVisitors>UnreadFields</omitVisitors>

答案 2 :(得分:0)

有必要提一下,如果要排除某个类,请注意其内部类。花了我几个小时才发现而不是

<Match>
    <Class name="com.some.Proto" /> <!--or com.some.Proto$.*-->
</Match>

我应该使用以下配置及其内部类逐一列出

<Match>
    <Or>
    <Class name="com.some.Proto$Event" />
    <Class name="com.some.Proto$Msg" />
    <Class name="com.some.Proto$Query" />
    </Or>
</Match>

到目前为止,我还没有找到如何排除一个类及其所有子类(不是filter中的线索),像com.some.Proto$.*这样的简单正则表达式不起作用。我还注意到正则表达式中的$表示行尾,而findbugs将其视为文本字符,我认为它应该是com.some.Proto\$Query。此外,一个有价值的regex tester通过解释其中的每个角色帮助我学习正则表达式。