SpotBugs Gradle Plugin 4.5.0で指摘をコンソールに出力する


SpotBugsの警告をコンソールに出力するために、以下の記事で紹介されている方法を使わせてもらっていたのですが、SpotBugs Gradle Pluginを4系にアップデートしたタイミングでハマったのでメモ

確認環境

  • macOS 10.15.5
  • Gradle 6.6.1
  • SpotBugs Gradle Plugin 4.5.0
  • SpotBugs 4.1.1

エラー内容

SpotBugs Gradle Pluginを4系にアップデートしようとすると、次のエラーが発生するようになりました。SpotBugs実行後にレポートXMLファイルのパスを取得して読み込むようになっているのですが、そもそもパスを解決できなくなってしまったようです。

Execution failed for task ':printSpotBugsResults'.
> Could not get unknown property 'xml' for SpotBugsReport container of type org.gradle.api.internal.FactoryNamedDomainObjectContainer.

修正方法

レポートファイルを解決する処理を書き換えます。例によってGradle力が低いので、これが一番いい方法かは自信ないです。

--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,7 @@ spotbugs {
 task printSpotBugsResults {
     doLast {
-        printSpotBugsXml spotbugsMain.reports.xml.destination
+        printSpotBugsXml spotbugsMain.reports.getByName("XML").destination
     }
 }

最終的なコード

最終的にはこんな感じのビルドスクリプトになりました。GradleやSpotBugsのバージョンを上げるたびにハマっている気がしますが、必要経費ということで我慢することにします。

build.gradle
import edu.umd.cs.findbugs.SortedBugCollection

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // SortedBugCollectionクラスを使うため
        classpath 'com.github.spotbugs:spotbugs:4.1.1'
    }
}

plugins {
    id 'com.github.spotbugs' version '4.5.0'
}

spotbugs {
    excludeFilter = file('./config/spotbugs/excludeFilter.xml')
    ignoreFailures = false
}

task printSpotBugsResults {
    doLast {
        // NOTE: SpotBugs Gradle Plugin 4.0 以降は reports.xml で参照できない
        // printSpotBugsXml spotbugsMain.reports.xml.destination
        printSpotBugsXml spotbugsMain.reports.xml.destination
    }
}

spotbugsMain.finalizedBy printSpotBugsResults

def printSpotBugsXml(File xml) {
    // 参考URL の printFBXml() と同じ
}

参考情報