山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

Spring Boot 環境変数の取得

前回、Spring Boot でファイルに定義されたプロパティの使用方法を紹介しました。
Spring Boot 独自のプロパティを定義して使う - 山崎屋の技術メモ

今回は、システムの環境変数に定義された値を取得する方法を紹介します。

結論から言うとプロパティファイルに定義した場合と同じ方法で取得しますが、ちょっと気をつけないといけないこともあります。
 
 

環境変数の値を取得

まず、環境変数に値を定義します。サンプルとして次のようにしました。
f:id:yyama1556:20190104103623p:plain

環境変数を定義したとき、すでに Eclipse が起動している場合は再起動しないと読み込めません。

Java 側で次のように「${org.yyama.hoge}」でこの環境変数が取得できます。

package org.yyama;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SampleApplication {

	@Value("${org.yyama.hoge}")
	private String property;

	public static void main(String[] args) {
		ConfigurableApplicationContext ctx = SpringApplication.run(SampleApplication.class, args);
		SampleApplication sa = ctx.getBean(SampleApplication.class);
		sa.run();
	}

	private void run() {
		System.out.println(property);
	}
}

環境変数の名前「ORG_YYAMA_HOGE」のアンダースコアをドットにして全て小文字にする必要があるので注意してください。このあたりが詳しいです。
Spring Bootで環境変数を使ってパラメータをセットする時の項目名の解釈 - Qiita

ただし、ためしに「${ORG_YYAMA_HOGE}」で取得してみたら、正しく取得できたので、どちらでも良いでしょう。プロジェクトごとに統一しておきましょう。

出力結果です。Spring Boot の標準のログの後に「hello! environment variable!」と出力されているのが確認できます。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

2019-01-04 10:41:35.747  INFO 1016 --- [           main] org.yyama.SampleApplication              : Starting SampleApplication on yyama-PC with PID 1016 (C:\workspace\sample\target\classes started by yyama in C:\workspace\sample)
2019-01-04 10:41:35.757  INFO 1016 --- [           main] org.yyama.SampleApplication              : No active profile set, falling back to default profiles: default
2019-01-04 10:41:36.614  INFO 1016 --- [           main] org.yyama.SampleApplication              : Started SampleApplication in 1.414 seconds (JVM running for 2.819)
hello! environment variable!

 
 

プロパティファイルの値と名前がコンフリクトした場合

では今回のプロジェクトの「application.properties」に「org.yyama.hoge」のプロパティが定義されていた場合、「@Value("${org.yyama.hoge}")」でシステム環境変数とプロパティファイルのどちらが優先されるか実験してみました。

application.properties です。

org.yyama.hoge=hello! property!

そのほかは変えずに実行してみた結果です。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

2019-01-04 10:49:21.135  INFO 6224 --- [           main] org.yyama.SampleApplication              : Starting SampleApplication on yyama-PC with PID 6224 (C:\workspace\sample\target\classes started by yyama in C:\workspace\sample)
2019-01-04 10:49:21.141  INFO 6224 --- [           main] org.yyama.SampleApplication              : No active profile set, falling back to default profiles: default
2019-01-04 10:49:21.990  INFO 6224 --- [           main] org.yyama.SampleApplication              : Started SampleApplication in 1.42 seconds (JVM running for 2.702)
hello! environment variable!

前回の実行と同じです。環境変数が優先されるようですね。このあたりはこの記事を参照してください。
Spring Bootの外部設定値の扱い方を理解する - Qiita
 
 

まとめ

プロパティファイルに定義された値の取得に続き、今回は Spring Boot を使用した環境変数の値の取得方法を紹介しました。
 
AWS や Twitter API のアクセスキーなどは、間違えて GitHub に公開しないようシステムの環境変数で管理するようにしたいと思います。

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

EclipseではじめるJavaフレームワーク入門 第5版 Maven/Gradle対応

EclipseではじめるJavaフレームワーク入門 第5版 Maven/Gradle対応