web-dev-qa-db-ja.com

スプリングブートアプリケーションの外部構成

外部構成ファイルを使用して実行するスプリングブートアプリケーションがあります。 jarとして(組み込みのサーブレットコンテナを使用して)実行すると、すべて問題ありません。しかし、私は外部サーブレットコンテナ(Tomcat)の下でそれを実行したいのですが、ここでは外部設定に問題があります。 @PropertySourceを試しましたが、この場合、アプリケーションはwarファイル設定にないプロパティのみを取得します。外部設定は内部設定を上書きしません。質問:内部構成をオーバーライドする外部構成をどのように構成できますか?

28
Aram Aslanyan

アプリケーションをjarとして実行している場合、現在のディレクトリでapplication.propertiesの形式の外部構成を使用している可能性があります。ただし、外部Tomcatでwarとしてデプロイする場合、「現在のディレクトリ」はあまり役に立ちません。現在のディレクトリが何であるかを見つけたとしても、そのTomcatで実行されているすべてのアプリケーションの場所は同じである可能性が高いため、複数のアプリケーションを実行している場合、うまく動作しません。

ここでは、アプリケーションで2つのPropertySourcesを宣言しています。

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})

internal.propertiesには、プロパティの「組み込み」デフォルト値が含まれます。 2番目のPropertySourceは、外部構成を含むファイルです。ファイルの名前自体がプロパティであることに注意してください。

これをアプリケーションのContext要素で(Tomcatで)外部的に定義します。

<Context docBase="/path/to/your/war/your.war">
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>

これにより、Tomcatで複数のアプリケーションを実行でき、各アプリケーションは独自の外部プロパティファイルを使用できます。 sameアプリケーションの複数のインスタンスを異なるプロパティで実行することもできます。

28
ci_

WarファイルとしてデプロイするときにSpring Boot application.propertiesを外部化するには、spring.config.location最初に、Spring Bootアプリケーションが構成されている場合:

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }

詳細については、これを確認してください solution

19
Daniel Mora

Spring Bootの提供 多くの方法 プロパティの場所を指定するために、ソースを変更する必要はありません。

Yoはspring.config.location値を定義できます。例:

  • あなたのTomcat/conf/Catalina/<Host>コンテキスト記述子:

    <Context>
        <Parameter name="spring.config.location" value="/path/to/application.properties" />
    </Context>
    
  • TomcatのJVMパラメーターとしてsetenv.shファイル:

    -Dspring.config.location=/path/to/application.properties
    
  • として SPRING_CONFIG_LOCATION環境変数。

16

構成ファイルフォルダーをset classpath line catalina.bat、catalina.sh(使用する場合はいずれか)に追加するか、setenv.bat/shファイルに追加できます。構成ファイルがwarクラスパスに追加されます。

例えば;

Windows環境では。

set CLASSPATH=D:\app\conf
0
mertaksu