6

せっかちな人のための更新:それは簡単です、以下のmartoeの答えのように、package.-代わりにサブパッケージスキャンに使用してください!package.*

マルチモジュールプロジェクトで動作するようには見えませんonlyAnalyze。設定したパッケージ(またはパターン)に関係なく、maven-findbugs-pluginは、packagename。*を渡すことで期待するようにサブパッケージを評価しません。

自分自身またはプラグインに問題があることを証明するために(私は常に前者だと思いますが!)、次の構造で小さな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には、2つの明らかな違反がある次のコードがあります。

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と同じ内容ですが、評価されるacme.*と想定している「onlyAnalyze」オプションが設定されているため、findbugsによって評価acme.Appされないことを期待していacme.moo.Appます。

ここで、を実行しmvn clean installて、findbugs、package、installをクリーンアップ、ビルド、テスト、実行します。これにより、次のfindbugsレポート(簡潔にするために省略)が生成され、ビルドが失敗することが予想されacme.Appますacme.moo.App

<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.Appと、分析されるのは分析されるだけであり、 acme.moo.App(悪い)ものではなく、no_detect.App(良い)ものでもありません。

onlyAnalyzeオプションに2つのワイルドカードを使用してみましたが、ビルドは成功しましたが、findbugsエラー(Dangling meta character '*'など)が発生しました。

期待されるすべてのクラス(および)を分析するonlyAnalyzesetを試してみました。これは、「機能する」ことを意味しますが、期待どおりではありません。つまり、分析したいクラスのすべての親パッケージを明示的に宣言する必要があります。これは、マルチモジュールプロジェクトで大きくなり、維持するのが困難になる可能性があります。acme.*,acme.moo.*acme.Appacme.moo.App

分析したいすべてのパッケージを定義する必要がありますか、それとも私が望むことを実行するワイルドカード/正規表現パターンを宣言できますか?

包含/除外XMLを使用したくないのは、現在時間がないため、はるかに多くのセットアップと推論が必要になるためです...

4

1 に答える 1

12

Findbugsのマニュアルを引用するには:「。*を.-に置き換えて、すべてのサブパッケージも分析する」

于 2012-02-14T20:05:59.107 に答える