VSCodeでJavaのフォーマッターをSpotlessにする
- #java
- #vscode
人生において、フォーマット差異が理由の差分確認ほど無意義な時間は無いと思っています。
VSCode とそれ以外のエディター利用者が混在する Java のプロジェクトでフォーマッターを共通化するノウハウを共有します。
尚、Javaのビルドツールには maven を使用する前提とします。
環境構築
タスクの実行に mise を使用し、フォーマッターに Spotless を使用します。Spotless の実行には mvnd を使用します。
通常の mvn でも実行可能ですが、mvn の場合、都度JVMが立ち上がる為、1ファイルのフォーマットに毎回3秒程掛かります。
mvnd であればそれが無い為、0.1秒ぐらいでフォーマットできます。
※ 初回起動に少し時間がかかる為、別途、ウォームアップタスクを用意した方が良いです。
mise use java@corretto-17 maven mvnd
VSCode拡張機能の設定
VSCode のデフォルトのフォーマッターを停止し、RunOnSave という拡張機能を使用して保存時に Spotless でフォーマットを行うようにします。 プロジェクトで利用する拡張機能はextensions.jsonに設定しておくのが良いです。
.vscode/extensions.json
{
"recommendations": [
"redhat.java",
"vscjava.vscode-java-test",
"vscjava.vscode-java-debug",
"vscjava.vscode-maven",
"vscjava.vscode-spring-boot",
"emeraldwalk.runonsave"
]
}
.mise.tomlにタスクを追加します。
.mise.toml
...
[tasks.format-file]
description = "Apply Google Java format to a single file"
usage = '''
arg "file" help="Target file full path"
'''
run = "mvnd spotless:apply -DspotlessFiles=${usage_file}"
次に.vscode/settings.jsonに設定を入れますが、このファイルはユーザー設定が保存されるため、git管理すべきではありません。通常は.gitignoreに入れておきます。
その代わりに.vscode/settings.base.jsonのようなファイルをgit管理しておき、以下のように設定しておきます。ポイントは"editor.formatOnSave": falseでデフォルトのフォーマッターを無効化しているところです。
java.configuration.runtimesはセットアップ用のスクリプト等を用意してmise where javaの内容で書き換えると良いでしょう。
尚、 mise where java の結果は通常、パッチバージョンまで含めたファイルパスになっていますが、別途、メジャーバージョンのみやマイナーバージョンまでのシンボリックリンクが用意されているので、適宜選択します。
.vscode/settings.json
{
"editor.formatOnSave": false,
"emeraldwalk.runonsave": {
"commands": [
{
"match": "\\.java$",
"cmd": "mise run format-file ${workspaceFolder}/${relativeFile}",
"message": "- Formatting..",
"messageAfter": "- Formatting complete",
"autoShowOutputPanel": "error"
}
]
},
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/path/to/mise/installs/java/corretto-17",
"default": true
}
]
}
コマンドラインで統一したフォーマッターを提供できるので、他のエディターにも適宜設定をすると良いです。
あと、CIには全体のフォーマットチェック(mvn spotless:check)も入れておきましょう。
以上です。