Spring Bootでapplication.properties(yml)を環境によって分ける方法

Spring Bootでapplication.properties(yml)を環境によって分ける方法

アプリケーションの設定ファイルであるapplication.propertiesを環境によって分けることができます。

src/main/resources/配下にapplication.properties(yml)がありますが、その中にdev環境ならapplication-dev.properties,it環境ならapplication-it.propertiesをアクティブにする、といったことができます。

application.properties内で以下を記述します。(spring.profiles.active)

spring:
  profiles:
    active: dev #devがアクティブになる

これでapplication-dev.properties(yml)、application-it.properties(yml)の両方があってもapplication-dev.properties(yml)ファイルが読み込まれるようになります。

タスクに引数を渡して各環境にデプロイする

各環境にデプロイする(jar,war作成)際にapplication.ymlファイルを開いて、dev,local,test等変更する必要があります。

これは面倒なので、引数を渡してant.replaceregexpで該当箇所を置換したいと思います。

build.gradleにdef getEnv()とtask replaceYml()を追加します。

plugins {
  id 'java-library'
}

repositories {
  jcenter()
}

dependencies {
  api 'org.apache.commons:commons-math3:3.6.1'
  implementation 'com.google.guava:guava:26.0-jre'
  testImplementation 'junit:junit:4.12'
}

def getEnv() {
  String d = System.getProperty('env')
  return d;
}

task replaceYml() {
  ant.replaceregexp(file: "src/main/resources/application.yml", match: "^.*active:\\s+(.*)", replace: " active: " + getEnv(), byline: "true", encoding: "UTF-8")
}

Gradleタスクビューから「assemble」を右クリックし、「Gradle実行構成を開く」をクリックします。「Gradleタスク」欄を以下のように設定します。

Spring Bootでapplication.properties(yml)を環境によって分ける方法 ※複数タスク実行する場合は半角スペース空けて指定

「プロジェクト設定」タブで引数を指定します。

Spring Bootでapplication.properties(yml)を環境によって分ける方法

envにtestという変数を指定しました。

これでassembleをすると、spring.profiles.activeがtestに変わってjarやwarファイルが作成されるようになり、自動でapplication.ymlのファイル内が変更されます。

コマンドラインでビルド

gradlew.batが配置されているディレクトリでビルドすることができます。

アセンブル

gradlew.bat assemble

クリーン

gradlew.bat clean

引数を渡したい場合、以下のように渡せばよいです。

gradlew.bat assemble -Denv=dev

環境変数

上記のように環境ごとにプロファイルを切り替える方法もありますが、application.ymlに環境変数を設定する方法もあります。

${環境変数:初期値}

初期値は省略可能です。AWS Lambdaの場合、Lambdaの環境変数を設定すると上書きできて便利です。

application.yml

spring:
  datasource:
    url: ${DB_URL:jdbc:h2:mem:sampledb}
    driver-class-name: ${DRIVER:org.h2.Driver}
    username: ${USER:sa}
    password: ${PASS:}

コメント

タイトルとURLをコピーしました