Обновление для нетерпеливых: это просто, используйте 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>
<p> This field is never read.&nbsp; Consider removing it from the class.</p>
</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 включения / исключения, потому что для этого требуется гораздо больше настроек и рассуждений, на которые у меня сейчас нет времени ...