Kotlin/Gradle プロジェクトで spring-boot-configuration-processor を利用する

Gradle で管理している Kotlin プロジェクトで spring-boot-configuration-processor を利用し、@ConfigurationProperties アノテーションが付与されたクラスに対するコンフィギュレーションメタデータ spring-configuration-metadata.json を自動生成する方法についてメモしています。

はじめに

IntelliJ IDEA で Spring Boot アプリケーションの application.yml を開いたときに、アプリケーション固有のプロパティの項目で

Cannot resolve configuration property ‘(プロパティ名)’

といった警告が出るのが煩わしいので、それを解消するために コンフィギュレーションメタデータの記したファイル spring-configuration-metadata.json を自動生成したい、というお話です。

このメタデータの自動生成は、Java のプロジェクトであれば Spring Boot のドキュメント に書かれているように org.springframework.boot:spring-boot-configuration-processor` の依存を追加すれば事は済むのですが、Kotlin のプロジェクトだとそのドキュメント通りにはいきません。

今回は Gradle で管理された Kotlin プロジェクトを対象に、build.gradle にどのような記述をすればコンフィギュレーションメタデータの自動生成が実現できるのか を明らかにします。

前提

今回検証に用いた各種ソフトウェア、ライブラリ、フレームワーク等のバージョンは以下のとおりです。

  • Java 8
  • Spring Boot 2.1.2.RELEASE
  • Kotlin 1.2.71
    • Spring Boot 2.1.2.RELEASE の BOM で指定されているバージョン
  • Gradle 5.1.1
  • IntelliJ IDEA 2018.3.3

Kotlin プロジェクトでの spring-boot-configuration-processor の利用

結論から述べると、以下のような build.gradle を用意して ./gradlew build を実行することでコンフィギュレーションメタデータが (PROJECT_ROOT)/build/tmp/kapt3/classes/main/META-INF/ ディレクトリ配下に生成されます。 IntelliJ IDEA における application.yml での警告表示は、これで解決するはずです。

buildscript {
    ext {
        springBootVersion = '2.1.2.RELEASE'
        kotlinVersion = '1.2.71'
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
    }
}

apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
apply plugin: 'org.springframework.boot'

group 'me.k11i'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation platform(group: 'org.springframework.boot', name: 'spring-boot-dependencies', version: springBootVersion)
    kapt group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: springBootVersion

    implementation group: 'org.springframework.boot', name: 'spring-boot-starter'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

compileKotlin {
    kotlinOptions.jvmTarget = '1.8'
}
compileTestKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

上記ファイルは komiya-atsushi/spring-boot-configuration-processor-example の GitHub リポジトリにサンプルコードとともに配置しています。

ポイントは以下のとおり:

  • Gradle 5 から BOM インポート機能が導入されたので、Spring Boot の BOM である org.springframework.boot:spring-boot-dependencies のインポートにそれを利用しています
  • org.springframework.boot:spring-boot-configuration-processor の依存は kapt コンフィギュレーションで宣言します
    • Java のプロジェクトであればドキュメントにあるように annotationProcessor コンフィギュレーションで宣言するところですが、Kotlin においてそれに相当するのが kapt です
    • このために kapt プラグインを利用します (apply plugin: 'kotlin-kapt' もしくは plugins { id 'org.jetbrains.kotlin.kapt' })
  • また org.springframework.boot:spring-boot-configuration-processor のバージョンは明示的に指定します
    • Spring Boot のドキュメントにはバージョンを指定しない形で spring-boot-configuration-processor の依存が記述されていますが、それだと Could not find org.springframework.boot:spring-boot-configuration-processor: のエラーが生じるためです

まとめ

  • Kotlin の場合は、アノテーションプロセッサとして kapt を使うよ
  • org.springframework.boot:spring-boot-configuration-processor への依存を記述する際は kapt コンフィギュレーションで宣言するよ
  • また org.springframework.boot:spring-boot-configuration-processor は明示的にバージョンを指定するよ