Плагин Maven Codehaus findbugs «onlyAnalyze» не работает должным образом - PullRequest
6 голосов
/ 13 февраля 2012

Обновление для нетерпеливых: это просто, используйте package.- для сканирования вложенных пакетов вместо package.*, как ответит Марто ниже!

Я не могу заставить 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.App и acme.moo.App и ничего больше.

Теперь я выполняю mvn clean install, чтобы очистить, собрать, протестировать, запустить findbugs, package, install, который выдает следующий отчет findbugs (сокращенный для краткости) и приводит к ошибке сборки, которая ожидается, поскольку acme.App и acme.moo.App * * 1030

<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, но это дает успешную сборку , но с ошибкой findbugs (Dangling meta character '*' и т. Д.).

Я попытался с onlyAnalyze, установленным на acme.*,acme.moo.*, который анализирует все ожидаемые классы (acme.App и acme.moo.App), что означает, что он "работает", но не так, как я ожидаю; то есть я должен явно объявить все родительские пакеты для классов, которые я хочу проанализировать: это может стать большим и трудным для поддержки в многомодульном проекте!

Нужно ли мне определять каждый пакет, который я хочу проанализировать, или я могу объявить шаблон подстановочного знака / регулярного выражения, который будет делать то, что я хочу?

Я бы предпочел не использовать XML включения / исключения, потому что для этого требуется гораздо больше настроек и рассуждений, на которые у меня сейчас нет времени ...

1 Ответ

12 голосов
/ 15 февраля 2012

Цитировать руководство Findbugs : "Заменить. * На .-, чтобы также проанализировать все подпакеты"

...