🧽

Java: prettier-javaを使ったコードフォーマット

2024/01/29に公開

モチベーション

Javaのプロジェクトでよく用いられるコードフォーマッタとして、google-java-formatやPalantir Java Format、Eclipse JDTなどが挙げられる。しかし、細かいカスタムを行うためのものでは無い、もしくは出来ないことからprettier-javaで好みのフォーマット[1]を適用する。

環境

構成

必要なファイル構成は以下の通り。それぞれを配置する流れを記述していく。

.
└── <project>/
    ├── .git/
    │   └── hooks/
    │       └── pre-commit
    ├── .github/
    │   └── workflows/
    │       └── check-format.yml
    ├── .prettierrc.yml
    ├── build.gradle
    └── package.json

build.gradle

plugins {
    // spotless
    id("com.diffplug.spotless") version "6.24.0"
}

repositories {
    mavenCentral()
}

// ...

spotless {
    // masterブランチとの差分にだけspotlessを適用する
    ratchetFrom 'origin/master'

    java {
        trimTrailingWhitespace()
        endWithNewline()
        removeUnusedImports()
        importOrder()

        // prettierrc.ymlから設定項目を読みprettierを適用する
        prettier().configFile("./.prettierrc.yml")
    }
}

package.json

{
  "devDependencies": {
    "prettier-plugin-java": "^2.5.0"
  }
}

prettierrc.yml

plugins:
  # プラグインを適用
  - prettier-plugin-java
# optional: 最大幅の設定
printWidth: 140

package.jsonprettierrc.yml を配置したのち、以下のコマンドを入力し依存を導入する。

# (npmが導入されていなければ導入する)
$ npm i

optional: pre-commit (./.git/hooks/pre-commit`)

pre-commit を設定してコミット前にフォーマッタを適用する。

#!/bin/sh
./gradlew spotlessApply

optional: GitHub Actions (./.github/workflows/check-format.yml)

CI上でフォーマッタが適用されているかを確認し、不完全であればワークフローを失敗させるようにする。

name: check-format
on:
  pull_request
permissions:
  contents: read
job:
  run-spotless:
    runs-on: ubuntu-latest
    steps:
      # spotlessのratchetFromのためmasterブランチもcheckout
      - uses: actions/checkout@v4
        with:
          ref: master
      - uses: actions/checkout@v4
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - uses: actions/setup-node@v4
        with:
          node-version: 21
          cache: "npm"
      - run: npm i
      - name: Setup gradle
        uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
      - run: ./gradlew spotlessCheck
脚注
  1. ネストした括弧を1段ごとに閉じる、ラムダ式でも2スペースでインデントするなど ↩︎

Discussion