2010-10-27 11 views
9

Ich habe ein Multiprojekt-Setup, mit Maven und dem Findbugs-Plugin. Ich muss einige Dateien in einem der untergeordneten Projekte ausschließen, also habe ich es zu findbugs-exclude.xml hinzugefügt. Das funktioniert, wenn ich das Teilprojekt einbaute.Findbugs Maven-Plugin - Findbugs-Exclude mit mehreren Projekten

Mein Problem kommt, wenn ich versuche, auf höchster Ebene zu bauen. Maven findet die findbugs-exclude.xml im Teilprojekt nicht. So ignoriert es meine Fehler nicht und scheitert an ihnen. Ich kann meine findbugs-exclude.xml in der obersten Ebene Verzeichnis, und der Ausschluss funktioniert. Aber das verschmutzt die oberste Ebene und würde nicht positiv gesehen werden.

Gibt es eine Möglichkeit, das Maven-Plugin die findbugs-exclude.xml Datei aus einem Unterverzeichnis zu verwenden? Am besten mit wenig bis gar nichts auf der obersten Ebene?

+0

Any Zugriffe auf diese Frage? Ich finde mich mit der gleichen Notwendigkeit, einen Verweis auf die Ausschlussdatei in das untergeordnete Projekt von der Elternpom-Datei –

+0

Nö, ich habe immer noch keine gute Lösung zu bekommen. Für den Moment aktualisiere ich nur die Dateien an beiden Orten. Verletzung DRY, yuck. –

Antwort

2

Eine Lösung hierfür ist ein separates Projekt zu erstellen, das den findbugs-excludes.xml enthält und dann die Abhängigkeit Plugin verwenden, um es lokal zu entpacken und zu platzieren, wo es so etwas wie dies erforderlich ist:

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

Mit diesem Ansatz Sie können dann diese Ausschlussdatei über Projekte hinweg teilen, wenn erforderlich, was eine gute oder eine schlechte Sache sein könnte, je nachdem, wie Sie es betrachten :) Darüber hinaus, wenn Sie ein dediziertes Findbugs-Projekt haben, können Sie verschiedene Geschmacksrichtungen erstellen Ausschlüsse, die Klassifikatoren verwenden und je nach Kontext einen bestimmten Klassifikator verwenden. Es ist nicht perfekt, aber es funktioniert für mich.

HTH, James

2

Hier ist, was ich in meinem aktuellen Projekt mache, bringt es findbugs-exclude.xml in dem übergeordneten Projekt (was ich weiß, Sie wollen nicht), aber es behebt das Problem DRY es der Aufrechterhaltung an zwei Orten. Es ist einfacher als das Entpacken, erfordert jedoch, dass die gesamte Projektstruktur lokal ist. (Ich denke, das Entpacken Lösung wäre nützlich, um die gleiche Konfiguration über viele Projekte, wie in einer Unternehmensumgebung zu verwenden.)

Ich speichern meine Findbugs Config in parent/src/main/resources/shared/findbugs-exclude.xml, aber solange es in übergeordnet ist das spezifische Verzeichnis doesn ' t Angelegenheit.

ich dann Eigenschaften verwenden, um die Position des ‚geteilten‘ Verzeichnis zu beschreiben:

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

Und diese Eigenschaften verweisen, wenn findbugs in der übergeordneten Konfiguration:

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

Alle direkten Kind Projekte werden jetzt Führen Sie findbugs aus, und verweisen Sie auf die Konfigurationsdatei im übergeordneten Objekt. Wenn Sie mehrere Ebenen der Projektverschachtelung haben, müssen Sie die myproject.parent.basedir im Unter-Parent überschreiben. Zum Beispiel, wenn Sie Eltern < - Unter Eltern < - Kind, würden Sie sagen:

<properties> 
    <myproject.parent.basedir>${project.parent.parent.basedir}</myproject.parent.basedir> 
</properties> 
0

Eine bessere Alternative zu der akzeptierten Antwort ist Maven-Remote-Ressourcen-Plugin zu verwenden. Ich mag James Ansatz, aber dann müssen Sie das saubere Plugin optimieren, um die entpackten Dateien im Ordner src zu löschen.

Nach James Vorschlag erstellen Sie ein separates Projekt, das die Findbugs enthält - ausgeschlossen.xml und fügen Sie den folgenden seiner pom-Datei:

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

Aktualisieren Sie die pom-Datei mit findbugs Plugin:

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

Vergessen Sie nicht com.myproject zu ändern: myartifactid: Version

maven-remote-resources-plugin kopiert Ihre freigegebenen Dateien in den Zielordner, so dass Sie das Standardverhalten von maven-clean-plugin nicht ändern müssen.

0

Wenn Sie nicht viele Dateien/Pakete ausschließen möchten, unterdrücken Sie einfach einige Warnungen - versuchen Sie es mit @SuppressFBWarning Annotationen. Das sollte mit sogar mehreren Modulprojekten funktionieren und Anmerkung kann in spezifische Projekte und Akten wo erforderlich hinzugefügt werden.

Abhängigkeiten für @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>