BuildProperties の取得の失敗

Gradleのビルド情報をSpringから取得したかったので色々調べていくと、以下の設定を追加することで可能になることが分かった。

springBoot {
    buildInfo()
}

https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#integrating-with-actuator.build-info

実際にこの設定を加えると取得できるようになったので安心していたが、何故か一部環境で ./gradlew bootRun で起動させようとすると以下のエラーが出て起動に失敗することが分かった。

...
***************************
APPLICATION FAILED TO START
***************************

Description:

... required a bean of type 'org.springframework.boot.info.BuildProperties' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.boot.info.BuildProperties' in your configuration.

よく分からないのはこれが ./gradlew bootRun で実行した場合にのみ発生することで、main関数から直接サーバーを立ち上げるとエラーが発生しないことだった。

エラー内容で検索をかけても一向に分からなかったが、プレーンなGradle + Spring Bootの環境に buildInfo() の設定を加えると正しく起動できたためこの環境との違いを確認していったところ、最終的に以下の設定が原因なことが分かった。

tasks {
    withType<BootRun> {
        sourceResources(sourceSets["main"])
    }
}

https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#running-your-application.reloading-resources

sourceResources(sourceSets["main"]) は静的リソースをソースの場所からロードするための設定で開発中の時に役に立つ設定のようだが、BuildPropertiesのもとになるbuild-info.propertiesはbuildディレクトリ以下に作成されるため、結果的にBuildPropertiesのBeanを作成できなくなっていた。

一応この設定を削除すれば動くようになったがこの設定自体は別に問題のある設定ではないため、代わりに buildInfo() の設定を以下に書き換えることにした。

springBoot {
    buildInfo {
        destinationDir = File("src/main/resources/META-INF")
    }
}

build-info.propertiesの出力先をbuildディレクトリではなくsrcディレクトリ以下にすることで、正しく起動できるようになった。

言い訳をするのであれば sourceResources(sourceSets["main"]) は自分で追加した設定ではないので内容を把握するのが遅れたというのはあるが、それでももっと早くにちゃんと動く環境との比較を行えばもっと早く原因を特定できたと思う。
エラーが発生したらまずエラー内容でググる、というのは基本だと思うが、もうちょっと色々余裕をもって作業する必要があるなと感じさせられる経験だった。