2009-08-11 10 views
7

¿Alguien sabe cómo configurar el complemento maven findbugs para generar un resumen de los errores en la consola (similar al plugin pmd)?Maven findbugs: check - Output Summary Of Bugs

En la actualidad findbugs: check solo imprime cuántos errores hay en total y necesito verificar el directorio de los metadatos individuales/findbugs y cada archivo findbugs.xml para solucionar los problemas.

<plugin> 
<groupId>org.codehaus.mojo</groupId> 
<artifactId>findbugs-maven-plugin</artifactId> 
<version>2.0.1</version>        
<configuration> 
     <xmlOutput>true</xmlOutput> 
     <xmlOutputDirectory>findbugsreports</xmlOutputDirectory> 
     <findbugsXmlOutput>true</findbugsXmlOutput> 
     <findbugsXmlOutputDirectory>target/site/findbugsreports</findbugsXmlOutputDirectory> 
     <debug>true</debug> 
</configuration> 
</plugin> 

Idealmente, sería bueno obtener un informe de resumen en la línea de comandos. ¿Algunas ideas?

+0

De hecho, no puedo entender por qué esta característica no se implementó primero en el complemento ... Extraño. – yegor256

+0

Enviado un ticket: https://sourceforge.net/tracker/?func=detail&aid=3111339&group_id=61626&atid=497856 – yegor256

Respuesta

3

Actualmente no existe un medio para hacer esto utilizando el complemento estándar. Puede crear un complemento para leer findbugsChecks.xml y generar la información que necesita.

El siguiente código arrojará el total de errores encontrados y los errores por paquete para cualquier proyecto con un findbugsChecks.xml en el directorio de salida. Puede configurar el nombre del fichero, lee estableciendo la propiedad findBugsChecks de la configuración:

package name.seller.rich; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 
import org.apache.maven.project.MavenProject; 
import org.codehaus.plexus.util.xml.Xpp3Dom; 
import org.codehaus.plexus.util.xml.Xpp3DomBuilder; 
import org.codehaus.plexus.util.xml.pull.XmlPullParserException; 

/** 
* @goal stats 
*/ 
public class FindbugsStatsMojo extends AbstractMojo { 

    /** 
    * Where to read the findbugs stats from 
    * 
    * @parameter expression="${findbugsChecks}" 
    *   default-value="${project.build.directory}/findbugsCheck.xml" 
    */ 
    private File findbugsChecks; 

    /** 
    * Output the Findbus stats for the project to the console. 
    */ 
    public void execute() throws MojoExecutionException, MojoFailureException { 
     if (findbugsChecks != null && findbugsChecks.exists()) { 
      try { 
       Xpp3Dom dom = Xpp3DomBuilder.build(new FileReader(
         findbugsChecks)); 

       // get the summary and output it 
       Xpp3Dom summaryDom = dom.getChild("FindBugsSummary"); 

       // output any information needed 
       getLog().info(
         "Total bug count:" 
           + summaryDom.getAttribute("total_bugs")); 

       Xpp3Dom[] packageDoms = summaryDom.getChildren("PackageStats"); 

       getLog().info(packageDoms.length + " package(s)"); 
       for (int i = 0; i < packageDoms.length; i++) { 
        String info = new StringBuilder().append("package ") 
          .append(packageDoms[i].getAttribute("package")) 
          .append(": types:").append(
            packageDoms[i].getAttribute("total_types")) 
          .append(", bugs:").append(
            packageDoms[i].getAttribute("total_bugs")) 
          .toString(); 
        getLog().info(info); 
       } 
      } catch (FileNotFoundException e) { 
       throw new MojoExecutionException(
         "Findbugs checks file missing", e); 
      } catch (XmlPullParserException e) { 
       throw new MojoExecutionException(
         "Unable to parse Findbugs checks file", e); 
      } catch (IOException e) { 
       throw new MojoExecutionException(
         "Unable to read Findbugs checks file", e); 
      } 
     } 
    } 
} 

para empaquetar el código, agregarlo a la carpeta src/main/java de un Mavenproject con un POM como esto:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>maven-findbugs-stats-plugin</artifactId> 
    <packaging>maven-plugin</packaging> 
    <version>0.0.1</version> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-core</artifactId> 
     <version>2.2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-plugin-api</artifactId> 
     <version>2.2.0</version> 
    </dependency> 
    </dependencies> 
</project> 

a continuación, ejecute mvn instalar para instalar el plugin.

Para utilizarlo realmente, puede ejecutarlo como un objetivo adicional en la línea de comandos, o vincularlo a su proyecto para ejecutarlo como parte del ciclo de vida estándar.

Aquí está el comando para ejecutar desde la línea de comandos (asumiendo que el proyecto ha sido previamente compilado:

mvn findbugs:check name.seller.rich:maven-findbugs-stats-plugin:0.0.1:stats 

para unir las configuraciones a su proyecto por lo que se puede ejecutar en cada generación, utilice la siguiente configuración:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>findbugs-maven-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
    <execution> 
     <id>check</id> 
     <phase>package</phase> 
     <goals> 
     <goal>check</goal> 
     </goals> 
    </execution> 
    </executions>        
    <configuration> 
    <xmlOutput>true</xmlOutput> 
    <xmlOutputDirectory>findbugsreports</xmlOutputDirectory> 
    <findbugsXmlOutput>true</findbugsXmlOutput> 
    <findbugsXmlOutputDirectory>${findbugsOutputDirectory}</findbugsXmlOutputDirectory> 
    <debug>true</debug> 
    <failOnError>false</failOnError> 
    </configuration> 
    </plugin> 
    <plugin> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>maven-findbugs-stats-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>stats</id> 
     <phase>package</phase> 
     <goals> 
      <goal>stats</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    </plugins> 
</build> 
+0

Pregunta tonta: ¿Por qué defines ejecuciones en tu declaración 'findbugs-maven-plugin'? – Snekse

3

Siguiendo a lo largo de los conceptos anteriormente he planteado esta cuestión en el seguimiento de incidencias findbugs maven. http://jira.codehaus.org/browse/MFINDBUGS-118. t también he codificado y enviado un parche que muestra los errores totales de cada proyecto. fácilmente podría ser modificado o obtener otros detalles.

El código ignora los proyectos especificados como productores de salidas POM y también ignora los proyectos cuyos POM especifican verdadero en su configuración de findbugs. Estamos ejecutando una gran generación maven multi-módulo con el parche aplicado.

Con el parche aplicado ejecutar findbugs MVN: comprobar y se obtiene algo parecido a la siguiente salida (salida ofuscado a proteger a los culpables :):

[INFO] Summary 
[INFO] ------- 
[INFO] C:\PATH\Abstraction\PalDefinitions\target/findbugsXml.xml 4 
[INFO] C:\PATH\System\target/findbugsXml.xml 19 
[INFO] C:\PATH\ApplicationLayer\target/findbugsXml.xml 13 
[INFO] C:\PATH\Support\ServiceStub\target/findbugsXml.xml 11 
[INFO] C:\PATH\Support\MultiPlatform\target/findbugsXml.xml 10 
[INFO] C:\PATH\Support\Serializer\target/findbugsXml.xml 19 
[INFO] C:\PATH\Support\Brander\target/findbugsXml.xml 19 
[INFO] C:\PATH\PlatformAbstraction\Pal1\target/findbugsXml.xml 8 
[INFO] C:\PATH\PlatformAbstraction\Pal2\target/findbugsXml.xml 0 
[INFO] C:\PATH\PlatformAbstraction\Pal3\target/findbugsXml.xml 0 
[INFO] C:\PATH\PlatformAbstraction\Pal4\target/findbugsXml.xml 0 
[INFO] C:\PATH\Framework\Common\target/findbugsXml.xml 12 
[INFO] C:\PATH\Framework\legacyFramework\target/findbugsXml.xml 7 
[INFO] C:\PATH\Framework\UIFramework\target/findbugsXml.xml 7 
[INFO] C:\PATH\ExecutionLayer\Stub\target/findbugsXml.xml 0 
[INFO] C:\PATH\ExecutionLayer\BB\BB\target/findbugsXml.xml 1 
[INFO] TOTAL = 130 
[INFO] ------- 
[INFO] Number of bugs 130 falls BELOW summaryThreshold 260. Check OK 
+0

El enlace al error JIRA está roto – yegor256

+0

Simplemente use la versión 2.5 o posterior del complemento. –

4

Yo uso este truco, basado en Maven-groovy- plugin:

<plugin> 
    <groupId>org.codehaus.groovy.maven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.0-rc-5-SNAPSHOT</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      def file = new File("${project.build.directory}/findbugsXml.xml") 
      if (!file.exists()) { 
      fail("Findbugs XML report is absent: " + file.getPath()) 
      } 
      def xml = new XmlParser().parse(file) 
      def bugs = xml.BugInstance 
      def total = bugs.size() 
      if (total &gt; 0) { 
      log.info("Total bugs: " + total) 
      for (i in 0..total-1) { 
       def bug = bugs[i] 
       log.info(
       bug.LongMessage.text() 
       + " " + bug.Class.'@classname' 
       + " " + bug.Class.SourceLine.Message.text() 
      ) 
      } 
      } 
     </source> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
0

Puede hacerlo con Violations Maven Plugin. Está configurado con patrones para identificar archivos de informes en el sistema de archivos. Debe ejecutarse después de findbugs o cualquier otra herramienta de análisis de código estático.

Será

  • Imprimir las violaciónes en el registro de generación.
  • Opcionalmente falle la compilación si el número de infracciones encontradas es mayor que un número configurado.