Плагин Findbugs Maven - findbugs-exclude с несколькими проектами - PullRequest
10 голосов
/ 27 октября 2010

У меня есть несколько проектов, использующих Maven и плагин Findbugs.Мне нужно исключить некоторые файлы в одном из дочерних проектов, поэтому я добавил его в findbugs-exclude.xml.Это работает, когда я строю подпроект.

Моя проблема возникает, когда я пытаюсь построить на верхнем уровне.Maven не находит findbugs-exclude.xml в подпроекте.Поэтому он не игнорирует мои ошибки и терпит неудачу из-за них.Я могу поместить свой findbugs-exclude.xml в каталог верхнего уровня, и исключение работает.Но это загрязняет верхний уровень и не будет восприниматься благоприятно.

Есть ли способ заставить плагин Maven использовать файл findbugs-exclude.xml из подкаталога?Желательно, чтобы на верхнем уровне практически не было изменений?

Ответы [ 4 ]

3 голосов
/ 22 июля 2011

Вот что я делаю в моем текущем проекте, он помещает findbugs-exclude.xml в родительский проект (который, я знаю, вы не хотите), но это устраняет проблему СУХОГО поддержания его в двух местах.Это проще, чем распаковка, но требует, чтобы вся структура проекта была локальной.(Я думаю, что решение по распаковке было бы полезно использовать во многих проектах одну и ту же конфигурацию, как в корпоративной среде.)

Я храню свою конфигурацию findbugs в parent/src/main/resources/shared/findbugs-exclude.xml, но пока она находится в родительскойконкретный каталог не имеет значения.

Затем я использую свойства, чтобы описать расположение «общего» каталога:

<properties>
  <myproject.parent.basedir>${project.parent.basedir}</myproject.parent.basedir>
  <myproject.parent.shared.resources>${myproject.parent.basedir}/src/main/resources/shared</myproject.parent.shared.resources>
</properties>

И ссылаюсь на эти свойства при настройке findbugs в родительском:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <configuration>
      <excludeFilterFile>${myproject.parent.shared.resources}/findbugs-exclude.xml</excludeFilterFile>
    </configuration>
    ...
</plugin>

Все прямые дочерние проекты теперь будут запускать findbugs, ссылаясь на файл конфигурации в parent.Если у вас есть несколько уровней вложенности проекта, вам придется переопределить myproject.parent.basedir в дочернем элементе.Например, если у вас есть parent <- sub-parent <- child, вы должны поставить: </p>

<properties>
    <myproject.parent.basedir>${project.parent.parent.basedir}</myproject.parent.basedir>
</properties>
2 голосов
/ 09 декабря 2010

Одним из решений для этого является создание отдельного проекта, который содержит findbugs-exclude.xml, а затем с помощью плагина зависимостей распакуйте и поместите его локально, где требуется что-то вроде этого:

<profile>
    <id>static-analysis</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack-findbugs</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.myproject</groupId>
                                    <artifactId>my-findbugs</artifactId>
                                    <version>0.1-SNAPSHOT</version>
                                    <type>jar</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>src/main/findbugs/</outputDirectory>
                                </artifactItem>
                            </artifactItems>
                            <!-- other configurations here -->
                            <excludes>META-INF/</excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <configuration>
                    <xmlOutput>true</xmlOutput>
                    <!-- Optional directory to put findbugs xdoc xml report -->
                    <xmlOutputDirectory>target/findbugs</xmlOutputDirectory>
                    <effort>Max</effort>
                    <threshold>Low</threshold>
                    <excludeFilterFile>src/main/findbugs/findbugs-excludes.xml</excludeFilterFile>
                </configuration>
                <executions>
                    <execution>
                        <id>findbugs-run</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

СПри таком подходе вы можете поделиться этим файлом исключения между проектами, если это необходимо, что может быть хорошим или плохим, в зависимости от того, как вы на это смотрите :) Кроме того, если подумать, если у вас есть выделенный проект findbugs, вы можете создавать различные вариантыисключения с использованием классификаторов и использование конкретного классификатора в зависимости от контекста.Это не идеально, но это работает для меня.

HTH, Джеймс

0 голосов
/ 28 июля 2017

Если вам не нужно много файлов / пакетов для исключения, просто отключите некоторые предупреждения - попробуйте использовать аннотации @SuppressFBWarning.Это должно работать даже с несколькими проектами модулей, и при необходимости можно добавлять аннотации в конкретные проекты и файлы.

зависимости для @SuppressFBWarning

    <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>annotations</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>jsr305</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
0 голосов
/ 15 июля 2016

Лучшей альтернативой принятому ответу является использование maven-remote-resources-plugin . Мне нравится подход Джеймса, но тогда вам нужно настроить чистый плагин, чтобы удалить распакованные файлы в папке src.

Согласно предложению Джеймса, создайте отдельный проект, который содержит findbugs-exclude.xml и добавьте в его файл pom следующее:

  <build>
    <plugins>
        <plugin>
            <artifactId>maven-remote-resources-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>bundle</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

Обновление pom-файла, содержащего плагин findbugs:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-remote-resources-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>process-remote-resources</id>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <resourceBundles>
                    <resourceBundle>com.myproject:myartifactid:version</resourceBundle>
                </resourceBundles>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <configuration>
        ...
        ...
        <excludeFilterFile>${project.build.directory}/maven-shared-archive-resources/findbugs-exclude.xml</excludeFilterFile>
        ...        
    </configuration>
</plugin>

Не забудьте изменить com.myproject: myartifactid: версия

maven-remote-resources-plugin копирует ваши общие файлы в целевую папку, поэтому нет необходимости изменять поведение по умолчанию maven-clean-plugin.

...