gradle
spring-boot
yml

Gradleのpropertiesをapplication.ymlから参照する


環境

Android開発環境じゃありません。

AndroidはBuildConfigFieldとか使ってた覚えがありますが、SpringBootで開発してる今はそんなもんありませんでした(勘違いだったらご指摘ください)。


経緯

gradle側とapplication側で同じ値を使うため、単純に二箇所に書きたくなかった事が発端でした。変えるときに絶対ミスするから2箇所に書きたくない。こんなん先人たちがやってるだろうとタカをくくったら全然資料ないし(ググり力足りない + 主に日本語の記事ばかり見てしまう)、四苦八苦しました。


方法


propertiesを宣言する

ここは普通に書くだけです。


gradle.properties

datasourceUrl=jdbc:mysql://localhost:13306/myApp?useSSL=false

datasourceUser=root
datasourcePassword=root
datasourceSchemas=my_app_db

applicationName=myApp
applicationVersion=0.0.1-SNAPSHOT



build.gradleに以下を追加


build.gradle


// ~~~~ 省略 ~~~~ //

import org.apache.tools.ant.filters.ReplaceTokens
processResources {
filesMatching('**/application.yml') {
filter(
ReplaceTokens,
tokens: [
'applicationName': "${applicationName}".toString(),
'version': "${applicationVersion}".toString(),
'datasourceUrl': "${datasourceUrl}".toString(),
'datasourceUser': "${datasourceUser}".toString(),
'datasourcePassword': "${datasourcePassword}".toString()
]
)
}
}



  • filesMatching()

    置き換えたい対象のファイルを指定します。指定しないと全ファイルが対象になります。


  • filter()

    対象の文字列を置き換えます。


filter(

ReplaceTokens, // ReplaceTokensを使う
tokens: ['置き換えたい対象ファイルに記載したKEY': '${置き換えたいpropertiesのKEY}']
)


使う側


application.yml

spring:

profiles:
active: local, development
# MySQL接続情報
datasource:
url: @datasourceUrl@
username: @datasourceUser@
password: @datasourcePassword@
app:
name: @applicationName@
version: @version@


  • 置き換えたい文字列を「@」で囲む。


終わり

これでクリーンビルドをすれば、ymlの値が置き換えられて参照できるようになります。

ymlから値を参照する方法は他に沢山資料があるのでそちらを。