findbugs工具是通过静态分析class文件来查找代码不合理项的工具,本文从通过Main方法调用和与maven集成两个方面来介绍findbugs的使用。

一、main方法集成

所有的java应用的主入口都是main方法,findbugs的main方法类为edu.umd.cs.findbugs.FindBugs2,因此我们在maven中添加对findbugs的依赖就可以直接调用其main方法。

                <dependency><groupId>com.google.code.findbugs</groupId><artifactId>findbugs</artifactId><version>3.0.1</version><type>jar</type></dependency>

调用main方法代码如下:

public static void main(String[] args) throws Exception {List<String> argsList = new ArrayList<String>();argsList.add("-help");       //可以查看findbugs支持的选项,即用法说明argsList.add("-html");argsList.add("-output");argsList.add("d:\\test.html");argsList.add("../com.ozl.project/target/classes");FindBugs2.main(argsList.toArray(new String[argsList.size()]));}

1、filter

findbugs提供了强大的filter能力,例如有些类可能是测试类,需要屏蔽掉,可以通过-exclude参数来控制过滤的范围,filter的内容参考如下:http://findbugs.sourceforge.net/manual/filter.html

我们的样例中只过滤其中的某些类,

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>  <!-- android-support-v4.jar:包过滤 -->  <Match>  <Package name="~android\.support\.v4.*" />  <!-- 以~开头的表示正则表达式 --></Match>  <!-- 类过滤、方法 -->  <Match>  <Class name="com.ozl.project.ProblemGroup"  />  </Match>       <!-- Match all doublecheck violations in these methods of "AnotherClass". -->  <Match>  <Class name="com.opencdk.AnotherClass" />  <Or>  <Method name="nonOverloadedMethod" />  <Method name="frob" params="int,java.lang.String" returns="void" />  <Method name="blat" params="" returns="boolean" />  </Or>  <Bug code="DC" />  </Match>  <!-- All bugs in test classes, except for JUnit-specific bugs -->  <Match>  <Class name="~.*\.*Test" />  <Not>  <Bug code="IJU" />  </Not>  </Match>
</FindBugsFilter>

在main方法中只需要添加-exclude参数,并指定filter.xml文件即可

2、自定义规则

有的时候需要自定义增加规则,因为findbugs扫描的是class文件,因此需要对class文件有一定的了解才能写出自定义规则的代码,本文选取网上常见的例子说明,即禁止使用System.out.println类为例来说明如何使规则生效

首先需要编写探测器类:

import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;
/*** @category 代码中避免使用有类似System.out的输出语句*/public class ForbiddenSystemClass extends OpcodeStackDetector {BugReporter bugReporter;    public ForbiddenSystemClass(BugReporter bugReporter) {        this.bugReporter = bugReporter;}    /*** visit方法,在每次进入字节码方法的时候调用 在每次进入新方法的时候清空标志位*/@Overridepublic void visit(Code obj) {        super.visit(obj);}    /*** 每扫描一条字节码就会进入sawOpcode方法* * @param seen*            字节码的枚举值*/@Overridepublic void sawOpcode(int seen) {        if (seen == GETSTATIC) {            if (getClassConstantOperand().equals("java/lang/System")) {                if(getNameConstantOperand().equals("out") || getNameConstantOperand().equals("err")){BugInstance bug = new BugInstance(this, "CJ_SYSTEMCLASS",NORMAL_PRIORITY).addClassAndMethod(this).addSourceLine(                                    this, getPC());bugReporter.reportBug(bug);}}}}
}

编写findbugs.xml文件,并放到src/main/resources目录下

<FindbugsPlugin>  <Detector class="com.ozl.findbugs.ForbiddenSystemClass"  speed="fast" reports="CJ_SYSTEMCLASS" hidden="false" />  <BugPattern abbrev="CJ_SYSTEMCLASS" type="CJ_SYSTEMCLASS" category="PERFORMANCE" />
</FindbugsPlugin>

编写messages.xml文件(注意文件名字,必须同名,否则加载不到),并放到src/main/resources目录下

<?xml version="1.0" encoding="UTF-8"?>
<MessageCollection>  <Plugin>  <ShortDescription>Default FindBugs plugin</ShortDescription>  <Details>  <![CDATA[ <p> This plugin contains all of the standard FindBugs detectors. </p> ]]>  </Details>  </Plugin>  <Detector class="com.ozl.findbugs.ForbiddenSystemClass">  <Details>  <![CDATA[ <p>代码不能出现System.out <p>请使用log日志形式打印 ]]>  </Details>  </Detector>  <BugPattern type="CJ_SYSTEMCLASS">  <ShortDescription>代码不能出现System.out</ShortDescription>  <LongDescription>{1}代码不能出现System.out,请使用log形式输出</LongDescription>  <Details>  <![CDATA[ <p>不能使用System.out和System.err,请使用log</p> ]]>  </Details>  </BugPattern>  <BugCode abbrev="CJ_SYSTEMCLASS">影响性能的输出System.out</BugCode>
</MessageCollection>

然后打成一个jar包,使用-pluginList来指定jar包。main方法如下:

public static void main(String[] args) throws Exception {List<String> argsList = new ArrayList<String>();// argsList.add("-help"); // 可以查看findbugs支持的选项,即用法说明argsList.add("-html");argsList.add("-output");argsList.add("d:\\test.html");argsList.add("-exclude");argsList.add("filter.xml");argsList.add("-pluginList");argsList.add("../com.ozl.findbugs/target/com.ozl.findbugs-1.0.0.jar");argsList.add("../com.ozl.project/target/classes");FindBugs2.main(argsList.toArray(new String[argsList.size()]));}

然后开心的运行main方法,但是却发现我们的规则并没有生效,什么鬼?

通过定位代码发现,需要对插件指定rank文件才行,默认的rank是20。因此需要增加bugrank.txt文件,内容如下:

16 Category PERFORMANCE

此时自定义规则生效。

二、findbugs与maven的集成

与maven的集成有两种形式,第一在pom文件build节点下面检查配置,第二在pom文件report节点下面配置findbugs插件,输出报告。

1、build节点配置findbugs插件

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>findbugs-maven-plugin</artifactId><version>3.0.1</version><executions><execution><goals><goal>check</goal></goals><configuration></configuration></execution></executions></plugin>

这样当出现findbugs问题的时候会导致构建失败

2、reporting配置findbug插件

 <plugins>  <plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>findbugs-maven-plugin</artifactId>  <version>3.0.1</version>  </plugin>  </plugins>

这样运行mvn site的时候会生成findbugs插件

3、自定义规则的集成

maven的配置中除了提供把规则作为一个artifact的方式:

<execution><goals><goal>findbugs</goal><goal>check</goal></goals><configuration><!-- <pluginList>xxx</pluginList> --><plugins><plugin><artifactId>com.ozl.findbugs</artifactId><groupId>com.ozl</groupId><version>1.0.0</version></plugin></plugins></configuration></execution>

这样规则的jar包可以通过maven管理起来了。

4、mojo代码的分析

MOJO的代码为FindBugsMojo,代码位于findbugs-maven-plugin-3.0.1.jar中,实际上是使用groovy实现的,把传入的参数构造为一个ant脚本,然后调用ant的能力拉去findbugs

def ant = new AntBuilder()log.info("Fork Value is ${fork}")if (log.isDebugEnabled()) {startTime = System.nanoTime()}def findbugsArgs = getFindbugsArgs(tempFile)ant.java(classname: "edu.umd.cs.findbugs.FindBugs2", inputstring: getFindbugsAuxClasspath(), fork: "${fork}", failonerror: "true", clonevm: "false", timeout: "${timeout}", maxmemory: "${maxHeap}m") {def effectiveEncoding = System.getProperty("file.encoding", "UTF-8")if (sourceEncoding) {effectiveEncoding = sourceEncoding}log.debug("File Encoding is " + effectiveEncoding)sysproperty(key: "file.encoding", value: effectiveEncoding)if (jvmArgs && fork) {log.debug("Adding JVM Args => ${jvmArgs}")String[] args = jvmArgs.split(FindBugsInfo.BLANK)args.each() { jvmArg ->log.debug("Adding JVM Arg => ${jvmArg}")jvmarg(value: jvmArg)}}if (debug || trace) {sysproperty(key: "findbugs.debug", value: true)}classpath() {pluginArtifacts.each() { pluginArtifact ->log.debug("  Adding to pluginArtifact ->" + pluginArtifact.file.toString())pathelement(location: pluginArtifact.file)}}findbugsArgs.each { findbugsArg ->log.debug("Findbugs arg is ${findbugsArg}")arg(value: findbugsArg)}}

注意拉起的main方法就是:edu.umd.cs.findbugs.FindBugs2

转载于:https://blog.51cto.com/5162886/1971564

findbugs使用总结相关推荐

  1. findbugs:may expose internal representation by ret

    2019独角兽企业重金招聘Python工程师标准>>> findbugs:1. *** getXXX() may expose internal representation by ...

  2. 在Eclipse或MyEclipse中安装findbugs插件

    2019独角兽企业重金招聘Python工程师标准>>> 我们都知道,在Eclipse或MyEclipse中安装插件有两种方式,一种是在线安装,第二种是先下载插件然后在本地安装. 在这 ...

  3. android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  4. Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果...

    为了规范代码,我们一般会集成静态代码检测工具,比如PMD.FindBugs.Checkstyle,那么Jenkins如何集成这些检查工具,并把检查结果放到构建邮件里呢? 今天做了调研和实现,过程如下 ...

  5. 如何更好地利用Pmd、Findbugs和CheckStyle分析结果

    这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下: Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题: – 可能的bug ...

  6. jenkins插件findbugs+pmd+checkstyle结合sonar与maven(java环境代码质量和代码规范管理)...

    一.下载jdk并安装(最好jdk官网下载解压安装的) 二.下载maven并安装maven 三.安装jenkins及插件 安装checkstyle.pmd.findbugs.maven.sonar等相关 ...

  7. Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  8. 配置FindBugs和常见FindBugs错误

    配置FindBugs: 在这里可以对FindBugs规则等进行详细设置. 选择你的项目,右键 => Properties => FindBugs => 1 Run Automatic ...

  9. jenkins+findbugs+checkstyle+PMD静态代码检查(二)

    可以根据自己的需求选中对应的插件进行配置(不一定非要同时配置三个插件) jenkins:持续集成的工具 fundbugs:检测代码静态错误的插件  例如:定义了没有用到的对象,string类型的比较使 ...

  10. IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件

    ##安装插件步骤: 1.打开settings 2.选择plugins 3.点击"Browse repositories" 4.搜索对应内插件,点击"install&quo ...

最新文章

  1. Debian/Ubuntu 报错解决:Command 'ifconfig' not found, but can be installed with
  2. Centos启动和禁用网卡命令
  3. 【渝粤教育】广东开放大学 商法 形成性考核 (40)
  4. windows多个服务器之间共享文件夹,windows server 2008 R2 部署NFS,实现多台服务器间、客户端间的共享目录。...
  5. c#之线程总结(一)
  6. Linux iostat和vmstat命令
  7. Docker与容器安全
  8. Json string value cannot have line breaks(解决方法)
  9. centos升级默认node版本
  10. 设计思想之高内聚低耦合
  11. PAIP.获取RSS全文输出.txt
  12. android获取Mac地址和IP地址
  13. 定时任务cron表达式
  14. OMRON继电器基础讲解
  15. android手机屏幕投影,安卓手机屏幕投影到电脑(笔记本)教程分享
  16. 优化算法 | 遗传算法(附Python代码)
  17. 神经元在人体内如何分布,人体神经元怎么分布的
  18. C++之文件批量改名
  19. 用计算机如何扫描仪,扫描仪的使用方法 扫描仪怎么用
  20. 基于android的备忘录_[译] 我个人的 Git 技巧备忘录

热门文章

  1. 【vue源码解析】目录
  2. java keydown事件_正确的方法来阻止keydown事件冒泡
  3. 印度游记: 在班加罗尔的一周
  4. STM32F7--->QSPI
  5. 传输阻抗的原理与测量 --特性阻抗的定义
  6. 机器人守则悖论_机器狗夜晚独自在外游荡,这意味着什么?机器人三原则的悖论...
  7. 开发和研发:区别很大
  8. Linux下安装PyCharm
  9. YUV色彩空间变换与采样格式
  10. 颜色矩特征提取matlab,彩色图像特征提取研究(一)