web-dev-qa-db-ja.com

Spring用のTomcat Webサーバーでapplication.propertiesを外部化する方法は?

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

- A /config subdirectory of the current directory.
- The current directory
- A classpath /config package
- The classpath root

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

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

質問:warサーバーでTomcatファイルを実行する場合:application.propertiesoutsideの追加の場所を追加するにはどうすればよいですかクラスパスまたはTomcatコンテナ(d:\application.properties?など)

カスタムの場所は、上記の場所に関して最も高い優先順位を取得する必要があります。

問題は、Tomcat webappsフォルダーの展開されたwar内に/configフォルダーを追加できますが、webappsフォルダーがクリーンアップされ、warが再デプロイされると、カスタム構成が失われることです。

したがって、外部に追加の場所を追加したいと思います。

14
membersound

Application.propertiesファイルを含むフォルダーを指すspring_config_location環境変数を設定できます。

Tomcatの場合、次の行を<Tomcat_HOME>/bin/setenv.shファイルに追加することでこれを実行できます(見つからない場合はファイルを作成します)。

export spring_config_location=/usr/local/Tomcat/conf/

プロパティファイルをそのフォルダーに配置します。複数のアプリがある場合、各アプリのプロパティファイルの名前を一意に設定できます。 Spring Bootアプリの場合、次のようにしました。

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        System.setProperty("spring.config.name", "my-app");
        SpringApplication.run(MyApplication.class, args);
    }
}

BOOTで実行すると、新しい名前が選択されます。 Tomcatにデプロイするときにも名前を構成するには、次のようにSpringBootServletInitializerの構成を上書きします。

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class).properties("spring.config.name: my-app");
    }

}

次に、プロパティファイルにmy-app.propertiesのような名前を付けます。 Springはデフォルト名の代わりにそれを探します。すべてのアプリのプロパティファイルを、サンプルの/usr/local/Tomcat/conf/という指定されたフォルダーに配置できます。外部プロパティが優先されます。優先順位についてはこちらをご覧ください: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

[〜#〜] update [〜#〜]

Spring Boot 2以降、spring_config_locationの動作が変更されました( 移行ガイド から):

以前はデフォルトの場所のリストに場所を追加していましたが、現在ではデフォルトの場所を置き換えます。以前の処理方法に依存していた場合は、代わりにspring.config.additional-locationを使用する必要があります。

したがって、ユースケースに基づいて、環境変数として設定するプロパティを検討する必要があります。新しいものは、spring_config_additional-location内のsetenv.shのようになります。ファイルの参照元は リファレンスドキュメント にも記載されています。

13
Vladimir Mitev

私にとって最も簡単な方法は、Tomcatのconfigフォルダー内にコンテキストファイルを配置することでした。たとえば、アプリケーションがルートパス(たとえば、http://your_domain.com/)ファイルを作成する必要がある[path_to_your_Tomcat]/conf/Catalina/localhost/ROOT.xml。アプリケーションが別のパスで実行されている場合、たとえばhttp://your_domain.com/example_pathファイルの名前は次のようになります[path_to_your_Tomcat]/conf/Catalina/localhost/example_path.xml。このファイル内で、ハードドライブのどこにでも配置できる外部application.propertiesファイルへのパスを指定できます。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="Java.lang.String"/>
</Context>
11
Grzegorz B.

私はそれを数回しなければならなかったが、見つけた最良のアプローチは、コンテナ内のクラスパスリソースとして外部ディレクトリを設定することです。

Tomcat classpath

次に、外部化するリソースをディレクトリに配置すると、すべてが正常に実行されます。春にリソースをロードするには、次のようにします。

<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
            <beans:property name="placeholderPrefix" value="!applicationProperties{" />
            <beans:property name="placeholderSuffix" value="}" />
        </beans:bean>

各Tomcatに複数のアプリケーションをデプロイしたいかもしれないと言ったように、クラスパスに設定したフォルダーにディレクトリ構造を作成して、異なるapplication.propertieswarアプリケーションごとに

enter image description here

Spring構成のアプリケーション名セクションを動的に維持したい場合は、mavenのパッケージング段階で、またはアプリケーションコンテキストパスを使用して、いくつかの方法でそれを行うことができます

1
jlumietu

誰かがLinuxソリューションを探しているなら、これは私たちのために働いています:
Tomcat startup.shを編集します
追加:

 export spring_config_location=/<YOUR_PATH>/application.properties

例:

 export spring_config_location=/app/conf/application.properties
0
user648026

ubuntu 18.04およびSpring Boot 2上のTomcat 9の場合、$ CATALINA_HOME/bin /の下にsetenv.shファイルを作成してください:

#!/bin/bash

export spring_config_additional_location="/opt/Tomcat/latest/conf/application.properties"

必要に応じてファイル許可を設定することを忘れないでください

0
Ming M Zheng

最後に、たとえばセキュアなプロパティを外部化するために次のプロパティを追加しました。

spring.config.additional-location=/etc/Tomcat/<appname>/application-production.properties

0
membersound