[小ネタ] GradleのLinterを導入して不要な依存関係を抽出してみた

2020.04.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

多くのJavaプロジェクトで使われているビルドツール、Gradleについて調べている過程で、プラグインの依存関係を確認する方法を知り、それに関連して不要なプラグインを洗い出す手順を試してみました。

設定

ここでは、既存のGradleプロジェクトの設定ファイルであるbuild.gradleを一時的に編集し、使用していないプラグインのみをLinterで検出してみます。
まずは、Gradle Lint Pluginをプロジェクトに追加し、Linterを導入します。
(ちなみにこのNebulaとは、Netflixが提供しているGradleのプラグイン集だそうです。)

buildscript {
	repositories {
		mavenCentral()
	}
	dependencies {
                classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'  // ← ★これを追記
	}
}

次に、rootプロジェクトを含む全プロジェクトに適用させるため、以下のようにallprojectsを追記します。
多くのrulesがあるようですが、ここではunused-dependencyを指定しています。

allprojects {
    apply plugin: 'nebula.lint'
    gradleLint.alwaysRun = false
    gradleLint.rules += 'unused-dependency'
}

実行

コマンドラインで次のように実行し、結果をログに出力させます。
(一例ですが、ここではwrapperを使用しています。そして-xオプションでテストを省略しています)

./gradlew -x compileTestJava lintGradle hogehoge:compileJava > lintGradle.log  2>&1

大きいプロジェクトだと少し時間がかかるかもしれませんが、完了後にlintGradle.logを見てみます。
例えば、以下のようにwarningが出力されていることを確認できました。

- snip -

warning   unused-dependency                  this dependency is unused and can be removed
hoge-prj/build.gradle:23
compile "ch.fuga.piyo:xxx:$xxxVersion"

warning   unused-dependency                  this dependency is unused and can be removed
hoge-prj/build.gradle:26
compile "jp.fuga:piyo:$yyyVersion"

warning   unused-dependency                  this dependency is unused and can be removed
hoge-prj/build.gradle:27
compile "org.hoge.piyo:zzz:$zzzVersion"

- snip -

おわりに

Gradleの依存関係で何らかの問題が生じた際は、ローカルキャッシュを削除してダウンロードをやり直すなどの方法を試すことになるかと思います。
そのような時に、予め不要なプラグインかどうかが分かっていると、その後のアクションが取りやすい場合があるかもしれません。
どなたかに届けば幸いです。

参考文献

Gradle Lint Plugin