web-dev-qa-db-ja.com

.ymlファイルでプロパティプレースホルダーを使用する方法

私はJavaとスプリングブートを使用しています。プロパティプレースホルダーを.ymlファイルに追加する方法を考えていました。いくつかの鮮明な例を見つけましたが、プロパティの場所がわかりませんプレースホルダーはインスタンス化されています。システムの環境変数やファイルなどにありますか?

Bootstrap.yml

spring:
  cloud:
    config:
      username: ${my.stored.files.username}
      password: ${my.stored.files.password}
      label: ${spring.cloud.find.label}
      uri: ${spring.cloud.config.uri}
      enabled: false
      failFast: true

ユーザーはプロパティプレースホルダーを使用していますが、ユーザーはそれをどこで宣言しましたか?この.ymlはどこから値を読み取りますか? (上記と同じ質問)接続を説明するドキュメントはありますか?

このWebアプリケーションは、「cf Push」を使用してクラウドファウンドリにプッシュされます。これにより、構成するmanifest.ymlファイルが自動的に選択されます。可能であれば、クラウドファウンドリの例はすばらしいでしょう。

理解/サンプルApplication.propertiesファイル

app.name=MyApp
app.description=${app.name} 

定義されているため、ユーザーは$ {app.name}を使用できました。上記の例で混乱しています。ユーザーが「$ {my.stored.files.username}を取得する方法と場所はどこですか。それはどこに定義されていますか?system.propertiesまたは環境変数にあると想定しています。誰でも確認できますか?

8
Jesse

徹底的な調査の結果、.ymlファイルでプレースホルダーを使用すると、環境変数からその値が読み取られることがわかりました。これは最初は私の理論の一部でしたが、誰も確認していません。

回答

spring:
  cloud:
    config:
      username: ${my.stored.files.username}
      password: ${my.stored.files.password}
      label: ${spring.cloud.find.label}
      uri: ${spring.cloud.config.uri}
      enabled: false
      failFast: true

*環境変数で*

Image as example

set key as: my.stored.files.username
set value as: UsernameSample

次に

アプリケーションを実行すると、ymlは次のように読み取ります。

    config:
      username: ${my.stored.files.username}
                //gets replaced with UsernameSample

これは私の問題を解決したリンクです link

15
Jesse

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

SpringApplicationは、次の場所にあるapplication.propertiesファイルからプロパティをロードし、Spring環境に追加します。

  • 現在のディレクトリの/ configサブディレクトリ
  • 現在のディレクトリ
  • クラスパス/ configパッケージ
  • クラスパスのルート

リストは優先順位で並べられています(リストの上位に定義されているプロパティは下位に定義されているプロパティをオーバーライドします)。

'.properties'の代わりにYAML( '.yml')ファイルを使用することもできます。

構成ファイル名としてapplication.propertiesを使用したくない場合は、spring.config.name環境プロパティーを指定して、別のファイル名に切り替えることができます。また、spring.config.location環境プロパティ(ディレクトリの場所またはファイルパスのコンマ区切りのリスト)を使用して、明示的な場所を参照することもできます。次の例は、別のファイル名を指定する方法を示しています。

 $ Java -jar myproject.jar --spring.config.name=myproject

次の例は、2つの場所を指定する方法を示しています。

$ Java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

spring.config.nameとspring.config.locationは、ロードする必要のあるファイルを決定するために非常に早い段階で使用されます。これらは、環境プロパティ(通常はOS環境変数、システムプロパティ、またはコマンドライン引数)として定義する必要があります。

Spring.config.locationに(ファイルではなく)ディレクトリが含まれている場合は、/で終了する必要があります(実行時に、ロードする前にspring.config.nameから生成された名前(プロファイル固有のファイル名を含む)が追加されます)。 spring.config.locationで指定されたファイルは、プロファイル固有のバリアントをサポートせずにそのまま使用され、プロファイル固有のプロパティによってオーバーライドされます。

構成の場所は逆の順序で検索されます。デフォルトでは、構成された場所はclasspath:/、classpath:/ config /、file:./、file:./ config /です。結果の検索順序は次のとおりです。

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

Spring.config.locationを使用してカスタム構成の場所を構成すると、デフォルトの場所が置き換えられます。たとえば、spring.config.locationが値classpath:/ custom-config /、file:./ custom-config /で構成されている場合、検索順序は次のようになります。

  • file:./custom-config/
  • classpath:custom-config/

または、spring.config.additional-locationを使用してカスタム構成の場所を構成する場合、デフォルトの場所に加えてそれらが使用されます。追加の場所は、デフォルトの場所の前に検索されます。たとえば、classpath:/ custom-config /、file:./ custom-config /の追加の場所が構成されている場合、検索順序は次のようになります。

  • file:./custom-config/
  • classpath:custom-config/
  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

この検索順序により、1つの構成ファイルでデフォルト値を指定してから、それらの値を別の構成ファイルで選択的にオーバーライドできます。アプリケーションのデフォルト値は、デフォルトの場所の1つにあるapplication.properties(または、spring.config.nameで選択した他のベース名)で指定できます。これらのデフォルト値は、カスタムの場所の1つにある別のファイルで実行時に上書きできます。

0
gavenkoa