Maven findbugs: check - Error output

Does anyone know how to configure the maven findbugs plugin to output a summary of errors to the console (like the pmd plugin)?

Currently findbugs: check, just prints out how many errors are there in general, and I need to check the target / findbugs directory of the individual modules and each findbugs.xml file to fix the problems.

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

Ideally, it would be useful to get the final report on the command line. Any ideas?

+7
maven-2 maven-plugin findbugs
source share
4 answers

There are currently no tools for this using the standard plugin. You can create a plugin to read findbugsChecks.xml and display the information you need.

The code below displays the common errors found and errors for each project using findbugsChecks.xml in the output directory. You can customize the name of the file that it reads by setting the findBugsChecks property in the configuration:

 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); } } } } 

To package this code, add it to the src / main / java Mavenproject folder using POM, like this:

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

Then run mvn install to install the plugin.

To actually use it, you can run it as an additional goal on the command line or associate it with your project so that it runs as part of the standard life cycle.

Here's the command to run from the command line (assuming the project has been compiled earlier:

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

To bind configurations to your project so that it runs in each assembly, use the following configuration:

 <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> 
+3
source share

I use this maven-groovy-plugin-based hack:

 <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> 
+4
source share

Following the above concepts, I raised this issue on the maven findbugs error tracker. http://jira.codehaus.org/browse/MFINDBUGS-118 . I also coded and presented a patch that shows common errors for each project. It can be easily changed to get other information.

The code ignores projects that are indicated as generating POM outputs, and ignores projects whose POMs indicate true in their findbugs configuration. We are launching a large multi-module assembly maven with the patch applied.

When using the patch, you run mvn findbugs: check and get something like the following output (obfuscation output to protect the perpetrators :):

 [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 
+3
source share

You can do this with Maven Plugin Violation . It is configured with templates for identifying report files in the file system. It should start after a search or any other static code analysis tool.

He will

  • Print the violations in the build log.
  • An assembly failure is optional if the number of violations detected is higher than the set number.
0
source share

All Articles