SpringBootアプリケーションの環境固有のapplication.propertiesファイル[クローズ]


87

Spring Bootアプリケーションで、環境固有のプロパティファイルを作成したいと思います。戦争中の私のアプリケーションのパッケージタイプであり、組み込みのTomcatで実行しています。stsを使用して、sts自体からメインを実行します。

  1. application- $ {env-value} .propertiesのような環境固有のプロパティファイルを作成できますか?

上記の場合、env-valueはlocal / devl / test / prodのような値になります

  1. env-valueファイルをどこに設定しますか?ローカルの場合、stsを介してjvm引数として設定できます

  2. SpringBootアプリケーションでapplication.propertiesを読み取るユーザー。

  3. 環境固有のプロパティファイルをロードする方法は?たとえば、データベースuid、pwd、schemaなどを環境固有のプロパティファイルに設定した場合、その場合、データソースはその中のプロパティを理解できますか?

  4. application.propertiesファイルとapplication-local.propertiesファイルを同時に使用できますか?


これを読んだことがありますか?基本的に、すぐにサポートされます。
M. Deinum 2015

私はしましたが、それは機能していません。だから私は同じ場所にapplication.propertiesファイルとapplication-local.propertiesファイルを持っています。application-local.propertiesファイルには、db関連のプロパティが含まれています。application.propertiesには、springmvcに関する単一のプロパティがあります。また、デバッグ構成として-Dprofile = localを追加しましたが、この値は取得されません
user3534483 2015

設定する必要があるspring.active.profilesので、を使用します-Dspring.active.profiles=local。代わりに。
M. Deinum 2015

成功しません。そのため、-Dprofileの代わりに、-Dspring.active.profiles = localを使用しています。次に、構成ファイルで値String driverClassName = env.getProperty( "driverClassName");をフェッチしようとします。envは春からの環境です
user3534483 2015

1
申し訳ありませんが、それを混ぜ合わせました:)。
M. Deinum 2015

回答:


173

Spring Bootプロファイルベースのプロパティをすでにサポートしています。

application-[profile].propertiesファイルを追加し、spring.profiles.activeプロパティを使用して使用するプロファイルを指定するだけです。

-Dspring.profiles.active=local

これにより、application.propertiesとがロードさapplication-local.propertiesれ、後者が最初からプロパティをオーバーライドします。


1
両方をロードせずに、特定のプロファイルの別のファイルでアプリケーションプロパティの使用をオーバーライドできますか?たとえば、テストや開発の場合は?
Hassam Abdelillah 2016

1
M. Deinum、私も同様の問題を抱えています。application.ymlとapplication-qa.ymlがあり、-Dspring.profiles.active = qaを指定しました。両方のファイルが読み取られますが、application-qa.ymlのプロパティは上書きされません。 application.ymlのプロパティ、私は常にapplication.ymlのプロパティのみを表示していますか?優先度を指定する方法はありますか?
Suresh 2016

5
こんにちは両方、これはあなたの問題を解決することができます。docs.spring.io/spring-boot/docs/current/reference/html/… 例: mkyong.com/spring-boot/…–
Anand Varkey Philips

私はawslambdaのコードを書いていますが、このkey = valueを環境値として渡すことができます-System.getenv()を使用してアクセスできます-動作しますか?
Abdeali Chandanwala 2017年

私は4つのアプリケーションを持っています-{profile} .propertiesファイル。そして、同じjarファイルを異なる環境で実行したいと思います。dev、test、prodとしましょう。したがって、-Dspring.profiles.active = localを使用することはできません。何か足りないものがあれば訂正してください。
Ashish Burnwal 2017

25

はい、できます。春を使用しているので、@PropertySource注釈を確認してください。

構成に注釈を付けます

@PropertySource("application-${spring.profiles.active}.properties")

好きなように呼んだり、必要に応じて複数のプロパティファイルを追加したりできます。すべての環境に属するセットやデフォルトがさらにある場合は便利です(@PropertySource {...、...、...}でも記述できます)。

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

次に、環境でアプリケーションを起動できます

-Dspring.active.profiles=test

この例では、nameはapplication-test-propertiesなどに置き換えられます。


3
問題は、それ$spring.profiles.active}が配列/コンマで区切られた文字列であるということです。そのため、複数のプロファイルがアクティブになっている場合は、期待したとおりに動作しない可能性があります。
M. Deinum 2016

これは真実ですが、2つのプロファイル(1つはデフォルト、もう1つはPropertySourceで定義)で正常に機能します。より高度な不動産の取り扱いについては、春の外を見る必要があると思います。また、PropertySourceは起動時にのみ読み取られます。プロパティ処理用の他のより高度なライブラリは、実行時にプロパティを変更することもできます。
tzen 2016

2
これは機能しましたが、なぜ手動でこれを行わなければならなかったのかまだわかりません。他のリポジトリの1つでは、これを行う必要はありませんでした。
Java Guy

7

私たちはこのようにすることができます:

application.yml

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

アプリケーションtest.yml

server:
  port: 5000

およびapplication-local.yml

server:
  address: 0.0.0.0
  port: 8080

その後、春のブートは私たちが望むように私たちのアプリを起動します。


2
この方法でアクティブプロファイルをハードコーディングしていませんか?:(
AnnaMedyukh19年

0

My Point、この方法では、開発者に関連するすべての環境を一度に作成するように求めているため、本番構成がエンド開発者に公開されるリスクがあります。

12ファクターによると、環境固有のものは環境のみに存在するべきではありません。

CICDの場合はどうすればよいですか

  • Springを一度ビルドして別の環境にプロモートします。その場合、Spring jarにすべての環境があると、セキュリティリスクが発生し、GITですべての環境変数が発生します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.