13

我有一个多项目设置,使用 Maven 和 Findbugs 插件。我需要在其中一个子项目中排除一些文件,所以我将其添加到findbugs-exclude.xml. 这在我构建子项目时有效。

当我尝试在顶层构建时,我的问题就出现了。findbugs-exclude.xmlMaven在子项目中找不到。所以它不会忽略我的错误并因此而失败。我可以将我findbugs-exclude.xml的放在顶级目录中,并且排除工作。但那是污染顶层,不会被看好。

有没有办法让 Maven 插件使用findbugs-exclude.xml子目录中的文件?最好在顶层几乎没有变化?

4

5 回答 5

4

一种解决方案是创建一个包含 findbugs-excludes.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,詹姆斯

于 2010-12-09T10:57:40.080 回答
3

这是我在当前项目中所做的,它放在findbugs-exclude.xml父项目中(我知道你不想要),但它解决了在两个地方维护它的 DRY 问题。它比解包更简单,但要求完整的项目结构是本地的。(我认为解包解决方案对于在许多项目中使用相同的配置很有用,就像在公司环境中一样。)

我将我的 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,引用父项中的配置文件。如果您有多个级别的项目嵌套,则必须覆盖myproject.parent.basedir子父级中的 。例如,如果您有 parent <- sub-parent <- child,您将输入:

<properties>
    <myproject.parent.basedir>${project.parent.parent.basedir}</myproject.parent.basedir>
</properties>
于 2011-07-22T16:22:15.097 回答
1

我使用的spotbugs原因findbugs已弃用,不再支持。我在我的项目中遇到了同样的问题。

我的maven项目多模块结构是这样的:

parent-module:
  |
  -- sub-module-1
  |     |
  |     -- ...
  |     |
  |     --pom.xml
  |
  -- sub-module-2
  |     |
  |     -- ...
  |     |
  |     --pom.xml
  |
  -- ...
  |
  -- sub-module-n
  |     |
  |     -- ...
  |     |
  |     --pom.xml
  |
  -- ...
  |
  -- exclude-filter.xml
  |
  --pom.xml

spotbugs配置parent-module

...
<build>
    ...    
    <plugins>
        ...
        <plugin>
            <groupId>com.github.spotbugs</groupId>
            <artifactId>spotbugs-maven-plugin</artifactId>
            <version>4.0.0</version>
            <dependencies>
                <dependency>
                    <groupId>com.github.spotbugs</groupId>
                    <artifactId>spotbugs</artifactId>
                    <version>4.0.2</version>
                </dependency>
            </dependencies>
            <configuration>
                <effort>Max</effort>
                <threshold>Low</threshold>
                <includeTests>true</includeTests>
                <xmlOutput>true</xmlOutput>
                <excludeFilterFile>exclude-filter.xml</excludeFilterFile>
            </configuration>
            <executions>
                <execution>
                    <id>analyze-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        ...
    </plugins>
...
</build>
...

不,您可以执行mvn test-compilefromparent-project或 any sub-project,它会检查spotbugs源代码和测试源代码问题。

考虑示例:https ://github.com/koresmosto/mif

于 2020-04-27T06:41:47.973 回答
0

接受答案的更好替代方法是使用maven-remote-resources-plugin。我喜欢 James 的方法,但是您需要调整 clean 插件以删除 src 文件夹中的解压缩文件。

根据 James 的建议,创建一个包含 findbugs-excludes.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>

更新包含 findbugs 插件的 pom 文件:

<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:version

maven-remote-resources-plugin 将您的共享文件复制到目标文件夹,因此无需更改 maven-clean-plugin 的默认行为。

于 2016-07-15T02:25:56.817 回答
0

如果您没有很多要排除的文件/包,只需抑制一些警告 - 尝试使用 @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>
于 2017-07-28T18:03:20.010 回答