一:问题背景
最近在研究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