一:問題背景
最近在研究jenkins的過程當中,針對maven項目,打算添加findbugs進行靜態檢查,但我不太想在項目的pom中進行修改,最好能夠只修改jenkins的job配置,即配置外部化。html
我發現:在jenkins安裝了findbugs插件後,只須要按照以下配置:java
1.配置maven的goal
2.配置構建後發佈Findbugs分析結果
保存後,點擊當即構建,便可正常生成報告,以下:git
3.問題出現
由於我也是看了網上的不少文章,不少都說須要在pom文件裏的build和report中配置findbugs插件。github
但配置通過我這樣的實測,證實並不須要如此。惟一須要作的就是:如上圖所示,在maven的goal中添加findbugs:findbugs便可。maven
可是,咱們項目組有本身的要求,好比某些findbugs的錯誤不須要檢查。那麼,我要怎麼樣才能指定,哪些錯誤須要檢查,哪些錯誤不須要檢查呢?ide
二:解決方案嘗試
1.廣泛作法
我首先用搜索引擎查找了幾篇,沒找到我想要的,網上的作法都是:測試
在項目的pom中指定規則文件的位置:ui
在pom文件的同級,放置excludeFilterFile(該文件中的規則不須要檢查)搜索引擎
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.1</version> <configuration> <excludeFilterFile>custom-findbugs-include.xml</excludeFilterFile> <!--<threshold>High</threshold>--> <!--<threshold>Low</threshold>--> <effort>Default</effort> <findbugsXmlOutput>true</findbugsXmlOutput> <findbugsXmlWithMessages>true</findbugsXmlWithMessages> <xmlOutput>true</xmlOutput> <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory> </configuration> </plugin> </plugins> </build> <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.1</version> <configuration> <xmlOutput>true</xmlOutput> <!-- Optional directoryto put findbugs xdoc xml report --> <!--<xmlOutputDirectory>target/site</xmlOutputDirectory>--> <findbugsXmlOutput>true</findbugsXmlOutput> <findbugsXmlWithMessages>true</findbugsXmlWithMessages> </configuration> </plugin> </plugins> </reporting>
經我試驗,這樣是可行的。可是不符合個人需求:我但願pom裏面都是乾乾淨淨的,findbugs只配置在jenkins中,項目不須要進行任何配置google
ok。繼續搜索解決方案吧。
2.閱讀插件官網的文檔
Maven的findbugs插件的官網地址:https://gleclaire.github.io/findbugs-maven-plugin/
在這裏面,查閱了findbugs:findbugs的文檔,看看有哪些配置參數:
(https://gleclaire.github.io/findbugs-maven-plugin/findbugs-mojo.html)
此時,有了一點收穫,在可選參數部分,看到以下參數,結合上面第一種解決方案的xml的配置,我幾何能夠認定,要找的就是這個參數:excludeFilterFile
ok。那麼咱們應該就它配置到jenkins裏面的maven goal中就能夠了吧。(個人pom文件和下面的custom-findbugs-include.xml同級,所以不須要指定路徑)
然而,當我興沖沖打開findbugs的報告,發現各類bug類型和以前相比,沒有變化。
期間百思不得其解,不明白爲何在pom中指定就能夠,在這裏指定就不行。
試了不少方法,最後我以爲:或許是這個配置壓根沒生效。
3.驗證猜測
生沒生效,這個只能經過maven的debug日誌來看了。因而我像上面的圖那樣,打開了debug日誌。
-X -e
這一次,在debug日誌的輸出中,下圖所示的位置,是空的(截圖我打了碼,由於我找不到以前的日誌了。)
因而知道了問題的緣由,果真是配置沒生效。
爲何不生效呢,應該是個人配置方式不對。
接下來,我翻遍了baidu、google的前幾頁的結果,依然沒有收穫。查到的幾乎都是傳統方案,也就是在pom中指定。
4.問題解決
這期間,查搜索引擎無果,因而又上qq,加了兩個羣,提了問題。但是,沒人回答。
這期間,我也順便把這個maven插件的源碼down了下來。導入到idea中,進行全局搜索:
終於,讓我發現以下代碼:
@Parameter( property="findbugs.excludeFilterFile" ) String excludeFilterFile
對java熟悉的人,應該很容易猜想:
這是個配置項,而key不是我以前猜想的excludeFilterFile,而是findbugs.excludeFilterFile
而後就簡單了,我很愉快地在jenkins中修改了配置:
終於,問題獲得瞭解決。
5.懸而未決的問題
這個excludeFilterFile相似於黑名單,那麼白名單行不行呢,我按照源碼:
@Parameter( property="findbugs.includeFilterFile" ) String includeFilterFile
將jenkins配置改爲
並無效果。這一點,打算後邊再查。(固然,對咱們組來講,黑名單,已經夠了)
3、踩坑感言
其實這個問題,很奇怪,翻遍了搜索引擎都沒結果,難道你們都沒這個需求嗎,無論怎麼說,但願能幫助到有須要的人。
抽絲剝繭的過程,其實很快樂。
另外附上我隨便寫的custom-findbugs-include.xml文件(僅供測試用,規則是隨便寫的):
<FindBugsFilter> <Match> <Bug pattern="DLS_DEAD_LOCAL_STORE"/> </Match> <Match> <Bug pattern="DM_BOXED_PRIMITIVE_FOR_PARSING"/> </Match> <Match> <Bug pattern="EI_EXPOSE_REP"/> </Match> <Match> <Bug pattern="EI_EXPOSE_REP2"/> </Match> <Match> <Bug pattern="ME_ENUM_FIELD_SETTER"/> </Match> </FindBugsFilter>
規則列表:
http://findbugs.sourceforge.net/bugDescriptions.html#BSHIFT_WRONG_ADD_PRIORITY