8

我正在评估 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/business/admin/ejb/_AdminRemoteHome_Stub.java

com/mycompany/business/admin/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。

4

3 回答 3

8

关于FindBugFilter

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

Java 元素名称匹配部分:

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

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

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

  • .*?EJS.*”而不是“ .*EJS*”,因为? 量词使匹配变得懒惰,避免“吃”EJS。(加号“ S*”表示“0或n S”,在这里没有帮助)

于 2009-07-02T10:44:03.830 回答
1

我的 findbugs 排除文件没有像上面那样工作。我正在使用 findbugs-maven-plugin v3.0.0。为了解决这个问题,我运行了一个生成 findbugsXml.xml 的构建,然后发出:

mvn findbugs:gui

这将启动用户界面来查找错误。然后我加载了 findbugsXml.xml 文件,导航到我希望排除的警告,排除它们,然后将排除项保存到 findbugs_exclude.xml。我将此添加到 maven 插件中

<excludeFilterFile>findbugs_exclude.xml</excludeFilterFile>

生成的文件有效,并且从 findbugs 报告中真正省略了排除项。

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

<omitVisitors>UnreadFields</omitVisitors>
于 2017-04-06T16:04:18.470 回答
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. 此外,一位有价值的正则表达式测试员通过解释其中的每个字符来帮助我进行正则表达式。

于 2018-01-18T03:35:43.477 回答