天天看點

Findbugs maven 插件使用Findbugs maven 插件使用

Findbugs maven 插件使用

FindBugs™手冊 http://findbugs.sourceforge.net/manual/index.html

0、概述

FindBugs是一個靜态分析工具,它将**位元組碼(是以需要先編譯)**與一組缺陷模式進行對比以發現可能的問題。有了靜态分析工具,就可以在不實際運作程式的情況對軟體進行分析。簡而言之,FindBugs其實就是對編譯後的class進行掃描,藉以發現一些隐藏的bug。比較典型的,如引用了空指針(null pointer), 特定的資源(db connection)未關閉,等等。如果用人工檢查的方式,這些bug可能很難才會被發現,或許直到運作時才發現…是以當我們用findbugs除掉了這些典型的bug後,我們系統的穩定度将會上一個新的台階。

一、接入方式

pom.xml 添加插件plugin

<build>
    <plugins>
        <!-- findbugs插件 -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.4</version>
            <configuration>
                <!-- 設定分析工作的等級,可以為min、default和max -->
                <effort>default</effort>
                <!-- Low、Medium和High (Low最嚴格) -->
                <threshold>Medium</threshold>
                <failOnError>true</failOnError>
                <includeTests>true</includeTests>
                <!--findbugs需要忽略的錯誤的配置檔案-->
                <excludeFilterFile>findbugs/findbugs-exclude-filter.xml</excludeFilterFile>
            </configuration> 
            <executions>
                <execution>
                    <id>run-findbugs</id>
                    <!-- 在package 階段觸發執行findbugs檢查,比如執行 mvn clean package -->
                    <phase>package</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
           

findbugs-exclude-filter.xml 内容示例

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Class name="~.*\.(model|entity|vo)\..*" />
        <Method name="~(get.*|set.*)" />
        <!-- <Bug pattern="EI_EXPOSE_REP" /> -->
        <Bug code="EI,EI2" />
    </Match>
    <Match>
        <Class name="~.*\.Authorization" />
        <Bug code="EI,EI2" />
    </Match>
</FindBugsFilter>
           

可以添加findbugs檢查規則檔案來使用使用者自己的規則

<configuration>  
  <excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>  
  <includeFilterFile>findbugs-include.xml</includeFilterFile>  
</configuration>  
           

二、如何使用

方式一、在控制台中執行打包指令

mvn 指令

mvn clean package // 隻有打包才觸發findbugs掃碼,由上面的配置設定。

mvn findbugs:help 檢視findbugs插件的幫助

mvn findbugs:check 檢查代碼是否通過findbugs檢查,如果沒有通過檢查,檢查會失敗,但檢查不會生成結果報表

mvn findbugs:findbugs 檢查代碼是否通過findbugs檢查,如果沒有通過檢查,檢查不會失敗,會生成結果報表儲存在target/findbugsXml.xml檔案中

mvn findbugs:gui 檢查代碼并啟動gui界面來檢視結果

方式二、使用IntelliJ IDEA的maven工具(其他IDE使用者忽略)

Findbugs maven 插件使用Findbugs maven 插件使用

如果出現下面的資訊,說明findbugs沒有發現bug,打包成功。(上圖是示範 打包失敗的案例)

[INFO] <<< findbugs-maven-plugin:3.0.4:check (run-findbugs) < :findbugs @ pmp-proscenium <<<
[INFO] 
[INFO] 
[INFO] --- findbugs-maven-plugin:3.0.4:check (run-findbugs) @ pmp-proscenium ---
[INFO] BugInstance size is 0
[INFO] Error size is 0
[INFO] No errors/warnings found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.627 s
[INFO] Finished at: 2019-04-09T21:38:35+08:00
[INFO] ------------------------------------------------------------------------
[WARNING] The requested profile "nexus" could not be activated because it does not exist.

Process finished with exit code 0

           

三、bug詳情檢視

如果在打包的過程中發現bug,則控制台會輸出bug的數量和檢視bug詳情的方式。下面是開發中的日志樣例:

[INFO] 

To see bug detail using the Findbugs GUI, use the following command "mvn findbugs:gui"

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.037 s
[INFO] Finished at: 2019-04-09T18:50:48+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.4:check (run-findbugs) on project pmp-proscenium: failed with 1 bugs and 0 errors  -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

           
  • 上面的日志提示,如果想檢視bug詳情,可以使用如下指令:“mvn findbugs:gui”
  • 打開一個終端,切換到項目的根目錄下,執行"mvn findbugs:gui",會出現如下的視窗。
Findbugs maven 插件使用Findbugs maven 插件使用
  • 按照bug詳情中的解釋,修改相應的代碼。
  • 注意點:如果bug數太多,有些bug根本不需要findbugs掃碼。可以通過配置檔案的方式過濾掉相應的包、類 、方法和異常 。下面介紹。

四、忽略指定的包、類、類中的方法

步驟一、在pom.xml中 增加配置。

<!-- findbugs插件 -->
<plugins>
    <build>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.5</version>
            <configuration>
				...
                <excludeFilterFile>conf/findbugs-exclude-filter.xml</excludeFilterFile>
            </configuration>
            <executions>
                <execution>
				...
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

           

步驟二、增加配置檔案,用于忽略指定的包、類、方法、異常。

  1. 建立conf/findbugs-exclude-filter.xml 檔案,路徑與src同級。
Findbugs maven 插件使用Findbugs maven 插件使用
  1. 配置檔案的用法如下:

    詳細的過濾規則可以參見官網: http://findbugs.sourceforge.net/manual/filter.html

過濾類:

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Class name="com.missxxxx.proscenium.plugin.misconf.ProsceniumConfig" />
    </Match>
</FindBugsFilter>
           

過濾包:

(老項目在接入findbugs時,盡量不要過濾整個包,而是把現有的類逐個過濾即可,這樣不妨礙新增加的檔案參與掃描)

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Package name="com.missxxxx.proscenium.plugin.misconf" />
    </Match>
</FindBugsFilter>
           

過濾方法:

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Class name="com.missxxxx.proscenium.service.CartShowServiceImpl" />
        <Method name="getResultData"></Method>
    </Match>
</FindBugsFilter>
           

過濾異常:

如果有多個包/類/方法需要過濾,就加多個Match标簽即可。

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
    <!--裝箱後拆箱緊接着裝箱,忽略不處理 -->
    <!-- Boxed value is unboxed and then immediately reboxed-->
    <Package name="~.*" />
    <Bug pattern="BX_UNBOXING_IMMEDIATELY_REBOXED" />
</Match>
</FindBugsFilter>
           

如果有多個包/類/方法需要過濾,就加多個Match标簽即可。

五、參考連結:

官網:https://gleclaire.github.io/findbugs-maven-plugin/usage.html

bug描述:http://findbugs.sourceforge.net/bugDescriptions.html

https://www.cnblogs.com/xuehanyu/p/4520816.html

https://blog.csdn.net/jokes000/article/details/7872849

https://blog.csdn.net/rainbow702/article/details/54138155

ven-plugin/usage.html

bug描述:http://findbugs.sourceforge.net/bugDescriptions.html

https://www.cnblogs.com/xuehanyu/p/4520816.html

https://blog.csdn.net/jokes000/article/details/7872849

https://blog.csdn.net/rainbow702/article/details/54138155

本文原連結:https://blog.csdn.net/so_geili/article/details/89169845