我正在评估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。
答案 0 :(得分:7)
(只是为了确定)你确定你正在考虑编译的类文件目录,而不是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通过解释其中的每个角色帮助我学习正则表达式。