現存するFindBugsErrorを全て除外設定してみる
いろいろな理由から、
「今あるFindBugsのエラーを一旦無視したい!」「だけどFindBugs自体は有効化させたままでいたい…!」
という時があるかもしれません。
(私は既存プロジェクトにFindBugsを途中から導入しようとしてこうなりました…。既に数百件のエラーがあります…。)
(「とりあえず今あるエラーは一旦無視して、これから発生する分は随時対応しようね」ということにしました。)
除外ルールを自動生成してしまおう!
FindBugsのレポートを生成
パースしやすいように、一時的にXMLにします。
task findbugs(type: FindBugs) { ... ignoreFailures = false effort = "max" reportLevel = "low" excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs_filter.xml") classes = files("$project.buildDir/intermediates/javac/") source 'src/main' include '**/*.java' reports { // xml.enabled = false // html.enabled = !xml.isEnabled() // html { // destination(new File("${project.rootDir}/build/reports/findbugs_report.html")) // } // 一時的に形式をXMLに変更 xml.enabled = true html.enabled = !xml.isEnabled() html { destination(new File("${project.rootDir}/build/reports/findbugs_report.xml")) } } classpath = files() ... }
Findbugsを実行
$ ./gradlew build # FindBugsは成果物を静的解析するので、まだであればbuildする $ ./gradlew findbugs
除外ルール自動生成
$ cat fb-filter-generator.rb #! /usr/bin/ruby require 'active_support' require 'active_support/core_ext' require 'open-uri' def create_match(classname:, abbrev:) <<~EOS <Match> <Class name="#{classname}"/> <Bug code="#{abbrev}"/> </Match> EOS end hash = Hash.from_xml open('./build/reports/findbugs_report.xml').read filter_xml = "" hash["BugCollection"]["BugInstance"].each do |bi| if bi["Class"].is_a?(Array) bi["Class"].each do |bc| filter_xml << create_match(classname: bc["classname"], abbrev: bi["abbrev"]) end else filter_xml << create_match(classname: bi["Class"]["classname"], abbrev: bi["abbrev"]) end end File.open('./findbugs_filter.xml','w') do |file| file.puts <<~EOS <?xml version="1.0" encoding="UTF-8"?> <FindBugsFilter> #{filter_xml} </FindBugsFilter> EOS end
↑のスクリプトをプロジェクト直下で実行します。
$ ruby ./fb-filter-generator.rb
実行したディレクトリに findbugs_filter.xml
という除外ルールのファイルができるはずです。
私はFindBugsの除外ファイルを
excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs_filter.xml")
と設定していますので、
$ mv ./findbugs_filter.xml ./config/findbugs/findbugs_filter.xml
と実行して設置しました。
これで、いま存在するFindBugsのエラーが全て除外できます!!!