SpringApplicationは、次の場所にあるapplication.propertiesファイルからプロパティをロードし、それらをSpring環境に追加します。
- A /config subdirectory of the current directory. - The current directory - A classpath /config package - The classpath root
リストは優先順に並べられます(リストの上位の場所で定義されたプロパティは、下位の場所で定義されたプロパティをオーバーライドします)。
質問:war
サーバーでTomcat
ファイルを実行する場合:application.properties
outsideの追加の場所を追加するにはどうすればよいですかクラスパスまたはTomcatコンテナ(d:\application.properties
?など)
カスタムの場所は、上記の場所に関して最も高い優先順位を取得する必要があります。
問題は、Tomcat webapps
フォルダーの展開されたwar内に/config
フォルダーを追加できますが、webappsフォルダーがクリーンアップされ、warが再デプロイされると、カスタム構成が失われることです。
したがって、外部に追加の場所を追加したいと思います。
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
のようになります。ファイルの参照元は リファレンスドキュメント にも記載されています。
私にとって最も簡単な方法は、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>
私はそれを数回しなければならなかったが、見つけた最良のアプローチは、コンテナ内のクラスパスリソースとして外部ディレクトリを設定することです。
次に、外部化するリソースをディレクトリに配置すると、すべてが正常に実行されます。春にリソースをロードするには、次のようにします。
<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.properties
war
アプリケーションごとに
Spring構成のアプリケーション名セクションを動的に維持したい場合は、mavenのパッケージング段階で、またはアプリケーションコンテキストパスを使用して、いくつかの方法でそれを行うことができます
誰かがLinuxソリューションを探しているなら、これは私たちのために働いています:
Tomcat startup.shを編集します
追加:
export spring_config_location=/<YOUR_PATH>/application.properties
例:
export spring_config_location=/app/conf/application.properties
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"
必要に応じてファイル許可を設定することを忘れないでください
最後に、たとえばセキュアなプロパティを外部化するために次のプロパティを追加しました。
spring.config.additional-location=/etc/Tomcat/<appname>/application-production.properties