2010-10-27 9 views
9

J'ai plusieurs configurations de projet, en utilisant Maven et le plugin Findbugs. J'ai besoin d'exclure certains fichiers dans l'un des projets enfants, donc je l'ai ajouté à findbugs-exclude.xml. Cela fonctionne quand je construis dans le sous-projet.Findbugs Plugin Maven - findbugs-exclude avec plusieurs projets

Mon problème vient quand j'essaie de construire au plus haut niveau. Maven ne trouve pas le findbugs-exclude.xml dans le sous-projet. Donc, il n'ignore pas mes erreurs et échoue à cause d'eux. Je peux mettre mon findbugs-exclude.xml dans le répertoire de premier niveau, et l'exclusion fonctionne. Mais cela pollue le plus haut niveau et ne serait pas considéré favorablement.

Existe-t-il un moyen d'obtenir le plugin Maven pour utiliser le fichier findbugs-exclude.xml depuis un sous-répertoire? De préférence avec peu ou pas de changement au niveau supérieur?

+0

Tous les hits sur cette question? Je me trouve avec le même besoin, en essayant d'obtenir une référence au fichier d'exclusion placé dans le projet enfant à partir du fichier parent pom –

+0

Non, je n'ai toujours pas une bonne solution. Pour l'instant, je ne fais que mettre à jour les fichiers dans les deux endroits. Violer DRY, beurk. –

Répondre

2

Une solution pour cela est de créer un séparé projet qui contient le findbugs-excludes.xml puis utiliser le plug-in de dépendance pour décompresser et placer localement là où il faut quelque chose comme ceci:

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

Avec cette approche, vous pouvez ensuite partager ce fichier d'exclusion entre les projets si nécessaire ce qui pourrait être une bonne ou une mauvaise chose selon la façon dont vous le regardez :) En outre, en y pensant, si vous avez un projet findbugs dédié, vous pouvez créer différentes saveurs les exclusions utilisant des classificateurs et l'utilisation d'un classificateur spécifique en fonction du contexte. Ce n'est pas parfait mais ça marche pour moi.

HTH, James

2

Voici ce que je fais dans mon projet actuel, il met findbugs-exclude.xml dans le projet parent (que je sais que vous ne voulez pas), mais il résout le problème DRY de la maintenir à deux endroits. C'est plus simple que le déballage, mais il faut que la structure complète du projet soit locale. (Je pense que la solution de décompression serait utile pour utiliser la même configuration sur de nombreux projets, comme dans un environnement d'entreprise.)

Je stocke mes findbugs config dans parent/src/main/resources/shared/findbugs-exclude.xml, mais tant que c'est dans le parent, le répertoire spécifique doesn ' t importe.

J'utilise ensuite des propriétés pour décrire l'emplacement du répertoire « partagé »:

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

Et utiliser ces propriétés lors de la configuration findbugs dans le parent:

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

Tous les projets enfants directs seront maintenant lancez findbugs, en référençant le fichier de configuration dans le parent. Si vous avez plusieurs niveaux d'imbrication de projet, vous devrez remplacer le myproject.parent.basedir dans le sous-parent. Par exemple, si vous avez des parents < - sous-parent < - enfant, vous mettriez:

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

Une meilleure alternative à la réponse acceptée est d'utiliser maven-ressources-distance-plugin. J'aime l'approche de James mais ensuite vous devez modifier le plugin propre pour supprimer les fichiers décompressés dans le dossier src.

Selon la suggestion de James, créez un projet séparé qui contient les findbugs-excludes.xml et ajouter ce qui suit à son fichier 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> 

Mise à jour du fichier pom contenant plugin 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> 

Ne pas oublier de changer com.myproject: myartifactid: Version

maven-remote-resources-plugin copie vos fichiers partagés dans le dossier cible, donc pas besoin de changer le comportement par défaut de maven-clean-plugin.

0

Si vous n'avez pas beaucoup de fichiers/packages à exclure, supprimez simplement certains avertissements - essayez d'utiliser les annotations @SuppressFBWarning. Cela devrait fonctionner même avec plusieurs projets de modules et des annotations peuvent être ajoutées dans des projets spécifiques et des fichiers si nécessaire.

dépendances pour

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