SpotlessでJavaのソースコードを綺麗に整えたい
皆さん、こんにちは。技術開発グループの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にまとめられています。
ではまた。