はじめに
Spring(Boot)でアプリを作成する際にシステム環境変数から値を取得したい場合がある。
メモ書きも兼ねて取得方法を紹介する。
どんな時にシステム環境変数を使うか
例えばDBに接続したい場合、application.properties
には以下のような設定をする必要がある。
### DB接続設定値 ###
spring.datasource.url=<データベースのURL>
spring.datasource.username=<ユーザー名>
spring.datasource.password=<パスワード>
こういった場合、各設定値をシステム環境変数から取得するようにしておけば、以下のようなメリットが考えられる。
①__環境ごとに設定ファイルを作成する必要が無くなる。__
環境変数を前もって設定しておくか、実行時に設定するようにすれば、同じ設定ファイルを他の環境でも利用することが出来る。
各環境ごとの設定ファイル(例えば、application-devXX.properties
)を複数作成し、管理するのは手間になるのでそれを省略できる。
また、環境ごとに読み込むファイルを設定する処理をソースコードに書かなくてよくなる。(SpringBootではデフォルトでapplication.properties
が読み込まれるので)
②__セキュリティの向上につながる。__
application.properties
内にユーザー名やパスパスワードといった秘密にしたい情報をベタ書きした状態で、リモートリポジトリに上げてしまったりするとセキュリティの問題にもなりかねない。
環境変数にしておけば、値は直接書かれないので安心してリモートリポジトリにpushできる。
application.properties
内でシステム環境変数を利用する方法
以下のようなフォーマットで設定する。
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
例えば、spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
について説明すると、
①まずシステム環境変数にSPRING_DATASOURCE_USERNAME=HogeHoge
のような変数を追加しておく。
環境変数名は設定ファイルの対象の値の「.」
を「_」
に置換したうえで全部大文字にしたものにする。
spring.datasource.username
⇒ spring_datasource_username
⇒ SPRING_DATASOURCE_USERNAME
②application.properties
内では、${SPRING_DATASOURCE_USERNAME}
のようにシステム環境変数名を${}
で囲った値にしておく。
これでシステム環境変数をapplication.properties
から利用することができるようになる。
注意点
eclipseやstsを使って開発をしている場合、システム環境変数を追加した後で、eclipse(sts)上でSpringBootアプリを起動したり、JUnitを実行しようとする際には一度再起動をした方がよい。
システム環境変数が読み取れずにエラーになる場合がある。
おそらく、eclipse(sts)起動時にシステム環境変数を読み込みそれを利用しているため、起動中に環境変数を追加しても反映されないからだと思われるが詳しくは不明。
結果
設定ファイルからシステム環境変数が利用できる!!!!!(ワザップ)