SpotlessでJavaのソースコードを綺麗に整えたい

n-ozawan

皆さん、こんにちは。技術開発グループのn-ozawanです。
今年、当社では35周年記念として社員旅行があります。今回は北海道とオーストラリアの選択制で、今週末に北海道旅行があり、来月にはオーストラリア旅行があります。

本題です。
Javaコードが規約通りにコーディングされているのかチェックしつつ、かつ、自動的にコードを整形して欲しいものです。Javaのフォーマッターは数多くありますが、Spotlessが便利でしたので紹介します。

Spotless

概要

Spotlessは多くの言語とフォーマッターに対応したツールです。Spotless自体はフォーマッターという訳ではありません。例えばTypeScriptでPrittierを適用したい場合は以下のように記述します。

spotless {
  typescript {
    target 'src/**/*.ts'
    prettier().configFile 'path-to/.prettierrc.yml'
  }
}

Spotlessは複数の言語と、複数のフォーマッターを内包しており、Spotless1つあれば、それぞれの言語に合わせたフォーマッターをインストールする手間が省けます。今回はそんなSpotlessでJavaのフォーマッターを設定したいと思います。

導入

Spotlessを導入します。環境はGradleです。build.gradleにSpotlessプラグインを導入するように記述します。

plugins {
	id 'com.diffplug.spotless' version '6.25.0'
}

eclipseのフォーマッタ設定XMLを使ってフォーマットするように設定します。

spotless {
  java {
    eclipse().configFile project.file("config/formatter/eclipse-java-style.xml")
  }
}

もし、google-java-formatでフォーマットする場合は以下のようにします。この場合、XMLを管理する必要はありません。

spotless {
  java {
    googleJavaFormat()
  }
}

設定ファイル

プロジェクトに合わせてフォーマットルールをカスタマイズしたいので、ecipseの設定XMLを読み込むようにしています。GoogleがGitHubでeclipse-java-google-style.xmlを公開していますので、このXMLをベースに編集を行います。

実行

Spotlessでチェックしたい場合は以下のコマンドを実行します。

./gradlew check

上記のコマンドはSpotlessだけでなく、Gradleにて設定した各種チェック処理を実行してくれます。前回、静的解析ツールであるCheckStyleを取り上げましたが、そのCheckStyleも./gradlew checkでチェックしてくれます。もし、Spotlessのみを実行したい場合は以下のコマンドを実行します。

./gradlew spotlessJavaCheck

以下のコマンドを実行することで、現在のソースコードを整形してくれます。

./gradlew spotlessApply

VS Codeの設定

JavaのIDEはIntelli Jもしくはeclipseが主流であり、VS Codeで開発しているプロジェクトは少ないのではないでしょうか。せっかくなので、ここではVS Codeの設定を紹介します。

拡張機能Extension Pack for Javaをインストールします。このExtension Pack for Javaは、VS CodeでJava開発に必要な拡張機能を1つにまとめたものです。VS CodeでJava開発するなら必須ともいえる拡張機能です。

settings.jsonに以下の設定を追加します。settings.jsonが無い場合は設定画面(Ctrl + ,)から設定しても大丈夫です。

{
  "editor.formatOnSave": true,
  "editor.formatOnPaste": true,
  "java.format.settings.url": "config/formatter/eclipse-java-style.xml"
}

"editor.formatOnSave": trueはファイル保存時にソースコードを整形するように指定しています。同様に、"editor.formatOnPaste": trueにより、ソースコードのペースト時にも整形するようにしています。

java.format.settings.urlには、フォーマットのXMLファイルへの相対パスを指定します。

おわりに

ソースコードは綺麗に保ちたいですよね。Spotlessを入れておけば色んな言語に対応しているので便利です。どの言語に対応しているかは公式のREADMEにまとめられています。

ではまた。

Recommendおすすめブログ