Spring Bootのコマンドラインからアクティブなプロファイルと構成の場所を設定する


164

スプリングブートアプリケーションがあります。

アプリケーション-> 開発、ステージング、本番に 3つのプロファイルがあります。だから私は3つのファイルを持っています

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

私のapplication.ymlは内部にありsrc/main/resourcesます。application.ymlのアクティブなプロファイルを次のように設定しました:

spring:
  profiles.active: development

他の3つのプロファイル固有の設定ファイルはC:\configフォルダにあります。

私はEclipseにGradleプラグインを使用しています。「bootRun」を実行しようとすると、EclipseのGradle構成でコマンドライン引数を次のように設定します

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

ただし、コマンドラインプロパティは反映されず、アクティブなプロファイルは常に開発として設定されます(これは、applications.ymlファイルで言及したものです)。また、C:\ Configフォルダーでは、プロファイル固有の構成ファイルが検索されません。

ここで何かが足りないと思います。私は過去2日間それを理解しようとしています。しかし、運はありません。私は本当にどんな助けにも感謝します。


bootRunコマンドラインも追加してください
Biju Kunjummen

私はこれまでEclipseからコマンドラインを実行していませんでした。しかし、「gradle bootRun -Dspring.config.location = C:\ Config \ -Dspring.profiles.active = staging」を使用して実行したところ、同じ結果が得られました。
O-OF-N

回答:


341

コマンドラインでスプリングプロパティを追加/オーバーライドするには、2つの方法があります。

オプション1:Javaシステムプロパティ(VM引数)

-Dパラメータがapplication.jarの前にあることが重要です。それ以外の場合は認識されません。

java -jar -Dspring.profiles.active=prod application.jar

オプション2:プログラムの引数

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c:\ config

45
-Dパラメータの順序は非常に重要です:)
martin '19

3
tomcatコンテナーを展開するときに、これをどのように実現できますか?その場合、tomcatのwebappsフォルダーに戦争を配置するだけです。システムプロパティを設定することによって?
prayagupd 2017年

@prayagupdはい、bash_profileでシステムプロパティを設定できます。
最高の願い

2
@maneeshええ、私はを介してエクスポートされた環境変数 を使用しSPRING_PROFILES_ACTIVEてい~/.bash_profileます。export SPRING_PROFILES_ACTIVE=e2e
prayagupd

1
順序が重要であると言う場合:-Dspring.profile.activeと-Dspring.config.locationの両方の引数を渡すことができますか?このように、最初の引数に従ってプロファイルが設定され、 2番目の引数?例:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur

26

私のベストプラクティスは、これをVMの「-D」引数として定義することです。Spring Boot 1.xと2.xの違いに注意してください。

有効にするプロファイルは、コマンドラインで指定できます。

スプリングブート2.x

-Dspring-boot.run.profiles=local

スプリングブート1.x

-Dspring.profiles.active=local

mavenでの使用例:

スプリングブート2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

スプリングブート1.x

mvn spring-boot:run -Dspring.profiles.active=local

複数のプロファイルの場合は、必ずコンマで区切ってください。

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar

あなたは春/春ブーツを意味しますか?(春1xと春2x)!
smilyface

1
@smilyfaceスプリングブーツ。スプリングブートはさまざまなバージョンでも利用できます:mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
私はspring-boot 2.1.3を使用-Dspring-boot.run.profiles=localしていますが、-Dspring.profiles.active=local機能しませんでした。
Donghua Liu

spring-boot 2.2.0:両方の動作: -Dspring-boot.run.profilesおよび-Dspring.profiles.active
Grigory Kislin

17

これを追加する必要がありました:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

そして、bootRunはプロファイルと構成の場所を取得します。

ポインタをありがとう@jst


7
これは、次のようにさらに簡単になりますbootRun { systemProperties = System.properties }。このコマンドは、-Dスイッチで渡されたすべてのパラメーターを、systemPropertyマップする同じキーでコピーします。
edufinn

これはgradle onlyのソリューションのようですが、一般的なソリューションはありませんか?
user1767316 2017

1
これを正確にどこに追加しますか?build.gradleファイルのどこか、またはファイル内の特定の場所にありますか?
Scala愛好家

16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

不正解です。

でなければなりません:

--spring.profiles.active=staging --spring.config.location=C:\Config

3
これにより、「認識できないオプション:
James Watkins

-Dは、Javaシステムプロパティを設定する正しい方法です。--somethingはbashパラメータです。
Xdg

--spring.profiles.active work for me、私がdocs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar

これは、EclipseでRun
As-

11
実際にはどちらも正しいですが、それはそれがどのように使用されているかによって異なります。それは、java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarまたはjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
デクスター・レガスピ


9

OS変数SPRING_PROFILES_ACTIVEを設定する別の方法があります。

例:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

参考:アクティブなSpringプロファイルの設定方法


はい。これにより、Gradleがシステムプロパティをアプリケーションに渡す方法を変更する必要がなくなります。
ben3000

これはきちんとした方法です。また、バージョン管理でチェックされないように、データベースユーザーとパスワード、その他の機密構成を設定するためにも使用する必要があります。
Igor Donin

7

Mavenプラグインを介してプロファイルを設定するときは、run.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

デバッグオプションあり:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

私はこの旅行がたくさんの人に会ったのを見てきました。


1
変更されましたmvn spring-boot:run -Dspring-boot.run.profiles=foo,bar:参照、docs.spring.io/spring-boot/docs/current/maven-plugin/examples/...
rwenz3l

@ rwenz3lありがとう!これでうまくいき、Spring Boot 1から2にプロジェクトをアップグレードしたところです。今度はそれらをすべてbashrcに追加します... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith

5

あなたの問題はおそらくあなたのspring.config.locationがパスを「/」で終わらせていないことに関連していると思います。

ドキュメントを引用

spring.config.locationに(ファイルではなく)ディレクトリが含まれている場合、それらは/で終わる必要があります(ロードされる前に、spring.config.nameから生成された名前が追加されます)。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files


ご指摘ありがとうございます。ただし、-Dspring.profiles.active = staging -Dspring.config.location = C:\ Config \を実行すると、同じ問題が発生します。アクティブなプロファイルでも反映されません。どういうわけか私のコマンドラインが渡されていないと思います。
O-OF-N

1
あなたはbootRunに引数を渡すために、この質問に与えられたアドバイスに従うべきstackoverflow.com/questions/25079244/...
JST

ありがとうございました。それは本当に役に立ちました。
O-OF-N

4

Michael Yinの答えは正しいですが、より良い説明が必要なようです!

-DJVMパラメータを指定する正しい方法であると多くの人が言っていましたが、あなたは完全に正しいです。しかし、Spring Boot Profilesのドキュメントで言及されているように、Michaelも正しいです。

ドキュメントで明確でないのは、どのような種類のパラメーターなのかです。これは--spring.profiles.active標準のJVMパラメーターではないため、IDEで使用する場合は、正しいフィールド(プログラムの引数)に入力します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.