2010-10-27 19 views
9

Tengo una configuración de proyecto múltiple, usando Maven y el complemento Findbugs. Necesito excluir algunos archivos en uno de los proyectos secundarios, así que lo agregué al findbugs-exclude.xml. Eso funciona cuando construyo en el subproyecto.Findbugs Maven plugin - findbugs-exclude con proyectos múltiples

Mi problema surge cuando intento construir en el nivel superior. Maven no encuentra el findbugs-exclude.xml en el subproyecto. Por lo tanto, no ignora mis errores y falla debido a ellos. Puedo poner mi findbugs-exclude.xml en el directorio de nivel superior, y la exclusión funciona. Pero eso está contaminando el nivel superior, y no sería visto favorablemente.

¿Hay alguna manera de hacer que el complemento Maven use el archivo findbugs-exclude.xml desde un subdirectorio? Preferiblemente con poco o ningún cambio en el nivel superior?

+0

Cualquier accesos a esta pregunta? Me encuentro con la misma necesidad, tratando de obtener una referencia al archivo de exclusión colocado en el proyecto hijo desde el archivo principal pom –

+0

No, todavía no tengo una buena solución. Por ahora solo estoy actualizando los archivos en ambos lugares. Violando DRY, puaj. –

Respuesta

2

Una solución para esto es crear un proyecto independiente que contiene el findbugs-excludes.xml y luego usar el plugin de dependencia para desempaquetar y colocarlo a nivel local donde se requiere algo como esto:

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

Con esta En este caso, puede compartir este archivo de exclusión entre proyectos si es necesario, lo que podría ser bueno o malo dependiendo de cómo lo vea :) Además, al pensar en ello, si tiene un proyecto de findbugs dedicado puede crear diferentes sabores de exclusiones usando clasificadores y el uso de un clasificador específico dependiendo del contexto. No es perfecto pero funciona para mí.

HTH, James

2

Aquí es lo que estoy haciendo en mi proyecto actual, pone findbugs-exclude.xml en el proyecto principal (que sé que usted no quiere), pero se soluciona el problema SECO de mantenerlo en dos lugares Es más simple que desempacar, pero requiere que la estructura completa del proyecto sea local. (Creo que la solución de desempaquetado sería útil para usar la misma configuración en muchos proyectos, como en un entorno corporativo.)

Guardo mi configuración de findbugs en parent/src/main/resources/shared/findbugs-exclude.xml, pero mientras esté en el directorio principal no lo haga t importa

Luego utilizo propiedades para describir la ubicación del directorio 'compartida':

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

y referencia estas propiedades cuando se configura findbugs en el padre:

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

Todos los proyectos niño directos a partir de ahora ejecuta findbugs, haciendo referencia al archivo config en el padre. Si tiene varios niveles de anidación de proyectos, deberá anular myproject.parent.basedir en el secundario. Por ejemplo, si tiene padres < - sub-matriz < - niño, que pondría:

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

una mejor alternativa a la respuesta aceptada es utilizar maven-remote-recursos-plugin. Me gusta el enfoque de James, pero luego necesita ajustar el complemento limpio para eliminar los archivos desempaquetados en la carpeta src.

Según la sugerencia de James, cree un proyecto separado que contenga los findbugs-excludes.xml y añada lo siguiente a su archivo de 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> 

actualización del archivo que contiene pom 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> 

No se olvide de cambiar com.myproject: myartifactid: Versión

maven-remote-resources-plugin copia sus archivos compartidos en la carpeta de destino, por lo que no es necesario cambiar el comportamiento predeterminado de maven-clean-plugin.

0

Si no tiene muchos archivos/paquetes para excluir, simplemente suprima algunas advertencias, intente con las anotaciones @SuppressFBWarning. Eso debería funcionar incluso con proyectos de módulos múltiples y la anotación se puede agregar en proyectos específicos y archivos donde sea necesario.

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