JarでSpringフレームワークの@PropertySource
アノテーションを使用して、jarの外部からプロパティファイルを読み込もうとしていますが、ファイルが見つかりません。
プロパティファイルをJarの外部に配置して、編集できるようにする必要があります。ファイルがどこにあるのか正確な場所はわかりません。クラスパスのどこにでも置くことができると思いました。
Config
クラスで次のアノテーションを使用しています。
@PropertySource('classpath:stc.properties')
そして、作成したJarファイルと同じディレクトリにstc.properties
を配置します。 Java
コマンドでクラスパスを明示的に指定しようとしましたが、それでもファイルが見つかりません。
Java -cp . -jar stc.jar
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load bean class: com.example.stc.Config; nested exception is Java.io.FileNotFoundException: class path resource [stc.properties] cannot be opened because it does not exist
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.Java:162)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.Java:299)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.Java:243)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.Java:254)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.Java:94)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.Java:609)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:464)
[...]
等。
また、クラスパスとして./
を使用し、jarのマニフェストのClass-Path
属性でクラスパス(両方のバリアントを含む)を指定しようとしましたが、常に同じ結果が得られます。
2つのファイルがあると仮定します。1つはローカル用で、もう1つは本番用です。
@PropertySources({
@PropertySource("classpath:application.properties"),
@PropertySource(value = "${ws.properties}", ignoreResourceNotFound = true)
})
そして、Tomcatまたはjarファイルで、このパラメーターを渡します
-Dws.properties=file:/path-to.properties
これをsetenv.shに追加しました
APPLICATION_OPTS = "-Dlog4j.configurationFile = file:$ PATH/log4j2.xml -Dlog4j.debug = true -Dapplication.properties = file:$ PATH/application.properties
これはSpring4でのみ可能です
変数(システムまたは環境)を使用してファイルの値を取得すると、次のようにファイルを参照できます。
@PropertySource("file:${MY_PATH}/application.properties")
私の環境は:
OS:Windows |コンテナ:Tomcat | Java:7 |春:4.2.4 | Springboot 1.3.1 | Maven
ステップ1 a(戦争):
ファイル外部化プロパティファイルをJVMシステムプロパティに追加します。
これをTomcatで実行しているため、 <Tomcat_HOME>/bin/setenv.bat
にsetenv.batを作成してこれを行いました
set CATALINA_OPTS=%CATALINA_OPTS% -Dexternal.app.properties=file:<PATH_TO_EXTERNAL_FILE>\application-prod.properties
ステップ1 b(jar):
Jarから実行している場合の代替方法:
-Dexternal.app.properties=file:<PATH_TO_EXTERNAL_FILE>\application-prod.properties
行の先頭でfile:を使用していることに注意してください。
ステップ2:アプリケーションのスタートアップクラスで、アノテーション@PropertySource
を使用して特定の環境アプリケーションのプロパティを読み込みました。
@SpringBootApplication
@PropertySources({
@PropertySource(value = "${external.app.properties.file}", ignoreResourceNotFound = true),
@PropertySource(value = "classpath:application.properties")
})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
ステップ:
プロジェクトで外部化されたプロパティを使用する
external/file/path/application-prod.properties
spring.datasource.url.ext = <PRODUCTION_DATASOURCE>
/ src/main/resources/application.properties
spring.datasource.url = $ {spring.datasource.url.ext}
これが同じ問題を抱えている他の人に役立つことを願っています。
ファイルのフルパスを指定してみてください。
@PropertySource('file:c:/.../stc.properties')
jarを実行するときに--spring.config.location = file:/ somepathパラメーターを使用できます。ここで、構成ファイルへのパスを指定します(相対パスの場合もあります)。
詳細 ドキュメント内