web-dev-qa-db-ja.com

Spring Boot yamlのapplication.propertiesでspring.config.locationを設定する方法

スプリングブート1.4.2を使用して、プロパティを設定してみます。

。propertiesおよび。ymlをexternal(リソース内)およびローカルファイルシステム(プロジェクトフォルダー外)。

。properties外部(リソースフォルダー内)は両方とも適切に機能します@ Value($ {property.name})および@ PropertySource最後の1つの使用値属性は、以下のようにファイルシステムからロードできます。

@Component
@PropertySource(value="file:C:\\properties\\application-dev.properties")
@PropertySource(value="file:C:\\properties\\application-test.properties")
public class ExternalProperties {
   // ...
}

しかし、。ymlは、ファイル名が 'application.yml'の場合、リソースフォルダーの下ではうまく機能しません

.ymlは@ConfigurationPropertiesでロードでき、「propdeps-plugin」が必要です

私の.ymlファイル

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App

このコードはうまく機能します

@Component
// external(inside resources)
@ConfigurationProperties(prefix="environments")
// outside project folder
@ConfigurationProperties(locations={"file:C:\\properties\\application.yml"}, prefix = "environments")
public class YamlProperties {

    private Map<String, String> dev = new HashMap<>();
    private Map<String, String> prod = new HashMap<>();

    public Map<String, String> getDev() {
        return this.dev;
    }

    public Map<String, String> getProd() {
        return this.prod;
    }
}

そのコードにはdeprecatedの場所属性の問題があるため(多くの記事を読みましたが、明確に理解できません)、APIドキュメントを見つけて 'ConfigFileApplicationListener'from this section

# SPRING CONFIG - using environment property only (ConfigFileApplicationListener)
spring.config.location= # Config file locations.
spring.config.name=application # Config file name.

したがって、このようなapplication.propertiesの上記のプロパティを記述します。

spring.config.location=file:C:\\properties\\application.yml
spring.config.name=application

そして.ymlプロパティを再ロードします(私はjarを実行しようとしませんでした。warを使用し、コントローラを介してテストします)

@Component
@ConfigurationProperties(prefix="environments")
public class YamlProperties {

     private Map<String, String> dev = new HashMap<>();
     private Map<String, String> prod = new HashMap<>();

     public Map<String, String> getDev() {
         return this.dev;
     }

     public Map<String, String> getProd() {
         return this.prod;
     }
}

このコードはローカルファイルシステムのC:ドライブから.ymlをロードしませんでしたが、application.ymlファイルをリソースフォルダーに追加するとうまく機能します。

それで、ロード.ymlにspring.config.locationを設定する方法

1.4のバージョンから非推奨になりましたが、location属性がまだ機能する理由を知りたいです。

configFileApplicationListenerの使い方を知りたくないのですが、理解しにくいコードを追跡できません。

編集:

戦争が再び始まり、ローカルファイルシステムのプロパティを使用して再度コンテキストを作成することについて、私はこれについて理解できません。これはまとめてリンクされているわけではありませんが、今後のステップとして残されています。

Tomcatをwarよりも再起動すると新しいファイルがデプロイされるため、Tomcatの再起動時に更新されたプロパティコンテキストである可能性があるこのファイルのデータを変更した場合、このファイルにプロパティが含まれています.

なぜ私はパブリックgithubアカウントを使用し、接続DB情報を他のものに保護するこの作業を試し続けるのですか?私はこれを手に入れ、git-encrpt、spring-cloude、nginx、dockerのような次の問題に進みます。本当に役立つ助けをありがとう。

6
DANIEL K

Spring Boot 1.4.2を使用しているため、すべてが簡単です。 Java -jar name-of-application-version.jar --spring.config.location=file:///C:/properties/application.ymlなど、アプリケーションに追加の引数を指定するだけです。これを実現するためのより一般的な方法は、Java -Dspring.config.location=file:///d:/private-bootstrap.yml -jar name-of-application-version.jarのようなJVMの追加オプションを定義することです。これらの2つの方法はどちらも機能し、デスクトップで正常に機能します。

2
Gemini Keith

Spring Bootアプリケーションを呼び出すときに、spring.config.locationプロパティを使用できます。以下は、カスタムの場所にカスタム名の4つのプロパティファイルがある例です。

Java -Dspring.config.location=file:/gfs/config/post/post.properties,/gfs/config/post/post_pwd.properties,/myDbConfig/config/db-config.properties,/myserver/config/db-passwd.properties  -jar myapp-1.0-SNAPSHOT.jar

コード内では、次の方法でそれらにアクセスできます。

@Component
public class AppProperties {

    @Value("${post.user.name}")
    private String username;
}
1
Mohith Maratt