Maven Codehaus findbugs 插件“onlyAnalyze”选项未按预期工作

Posted

技术标签:

【中文标题】Maven Codehaus findbugs 插件“onlyAnalyze”选项未按预期工作【英文标题】:Maven Codehaus findbugs plugin "onlyAnalyze" option not working as expected 【发布时间】:2012-03-04 18:45:36 【问题描述】:

不耐烦的更新:很简单,使用package.-进行分包扫描,而不是package.*,按照martoe的回答如下!

我似乎无法让onlyAnalyze 为我的多模块项目工作:无论我设置什么包(或模式),maven-findbugs-plugin 都不会像我期望的那样评估子包通过它包名.*.

为了证明我自己或插件的错误(尽管我一直认为是前者!),我设置了一个具有以下结构的小型 Maven 项目:

pom.xml
src/
    main/java/acme/App.java
    main/java/acme/moo/App.java
    main/java/no_detect/App.java

这很简单!

POM 有以下 findbugs 配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.4.0</version>
            <executions>
                <execution>
                    <phase>verify</phase>
                    <goals><goal>findbugs</goal><goal>check</goal></goals>
                </execution>
            </executions>
            <configuration>
                <debug>true</debug>
                <effort>Max</effort>
                <threshold>Low</threshold>
                <onlyAnalyze>acme.*</onlyAnalyze>
            </configuration>
        </plugin>
    </plugins>
</build>

每个 App.java 都有以下代码,有两个明显的违规行为:

package acme;
import java.io.Serializable;

public class App implements Serializable

    private static final class NotSer 
        private String meh = "meh";
    

    private static final NotSer ns = new NotSer();// Violation: not serializable field

    public static void main( String[] args )
    
        ns.meh = "hehehe";// Vilation: unused
        System.out.println( "Hello World!" );
    

请注意,no_detect.App 的内容与上述相同,但我的预期是 findbugs 不会对其进行评估,因为我将“onlyAnalyze”选项设置为acme.*,我假设它会评估acme.Appacme.moo.App 仅此而已。

我现在执行 mvn clean install 来清理、构建、测试、运行 findbugs、打包、安装,这会生成以下 findbugs 报告(为简洁起见)并导致构建失败,这是预期的,因为 acme.App 和 @ 987654333@:

<BugInstance category='BAD_PRACTICE' type='SE_NO_SERIALVERSIONID' instanceOccurrenceMax='0'>
<ShortMessage>Class is Serializable, but doesn't define serialVersionUID</ShortMessage>
<LongMessage>acme.App is Serializable; consider declaring a serialVersionUID</LongMessage>
<Details>
  &lt;p&gt; This field is never read.&amp;nbsp; Consider removing it from the class.&lt;/p&gt;
</Details>
<BugPattern category='BAD_PRACTICE' abbrev='SnVI' type='SE_NO_SERIALVERSIONID'><ShortDescription>Class is Serializable, but doesn't define serialVersionUID</ShortDescription><Details>
<BugCode abbrev='UrF'><Description>Unread field</Description></BugCode><BugCode abbrev='SnVI'><Description>Serializable class with no Version ID</Description></BugCode>

总结一下:只分析了acme.Appacme.moo.App 不是(坏),no_detect.App 也不是(好)。

我尝试在 onlyAnalyze 选项中使用两个通配符,但这会产生成功构建,但会出现 findbugs 错误(Dangling meta character '*' 等)。

我尝试将onlyAnalyze 设置为acme.*,acme.moo.*,它分析所有预期的类(acme.Appacme.moo.App),这意味着它“有效”,但不像我预期的那样;即,我必须为要分析的类显式声明所有父包:在多模块项目中,这可能会变得很大且难以维护!

我是否必须定义我想要分析的每个包,或者我可以声明一个通配符/正则表达式模式来满足我的需求?

我宁愿不使用包含/排除 XML,因为这需要更多的设置和推理,而我目前没有时间......

【问题讨论】:

【参考方案1】:

引用Findbugs manual:“将 .* 替换为 .- 以分析所有子包”

【讨论】:

在我沮丧和疯狂的搜索中,我设法没有真正使用 RTFM - 尽管公平地说,我自己从未真正找到过该文档。谢谢!

以上是关于Maven Codehaus findbugs 插件“onlyAnalyze”选项未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

禁用父 POM 中定义的 Maven 插件

Maven Findbugs 插件 - 如何在测试类上运行 findbug

maven codehaus.mojo 无法解决

如何使用 Maven 3.x 为 findbugs 生成 html 报告

任何从没有站点:站点的 Maven 生成 Findbug HTML 报告的简单方法?

GWT 2.1 和 Codehaus Maven 插件