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' }
)
- Java のプロジェクトであればドキュメントにあるように
- また
org.springframework.boot:spring-boot-configuration-processor
のバージョンは明示的に指定します- Spring Boot のドキュメントにはバージョンを指定しない形で
spring-boot-configuration-processor
の依存が記述されていますが、それだとCould not find org.springframework.boot:spring-boot-configuration-processor:
のエラーが生じるためです
- Spring Boot のドキュメントにはバージョンを指定しない形で
まとめ
- Kotlin の場合は、アノテーションプロセッサとして kapt を使うよ
org.springframework.boot:spring-boot-configuration-processor
への依存を記述する際はkapt
コンフィギュレーションで宣言するよ- また
org.springframework.boot:spring-boot-configuration-processor
は明示的にバージョンを指定するよ