web-dev-qa-db-ja.com

クラスパス上の外部ファイルのJar内の@PropertySource

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属性でクラスパス(両方のバリアントを含む)を指定しようとしましたが、常に同じ結果が得られます。

7
brianmearns

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でのみ可能です

13
vsingh

変数(システムまたは環境)を使用してファイルの値を取得すると、次のようにファイルを参照できます。

@PropertySource("file:${MY_PATH}/application.properties")
9
Hammad Dar

私の環境は:

OS:Windows |コンテナ:Tomcat | Java:7 |春:4.2.4 | Springboot 1.3.1 | Maven

ステップ1 a(戦争)

ファイル外部化プロパティファイルをJVMシステムプロパティに追加します。

これをTomcatで実行しているため、 <Tomcat_HOME>/bin/setenv.batsetenv.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}

これが同じ問題を抱えている他の人に役立つことを願っています。

1
Ithar

ファイルのフルパスを指定してみてください。

@PropertySource('file:c:/.../stc.properties')
0
Iob

jarを実行するときに--spring.config.location = file:/ somepathパラメーターを使用できます。ここで、構成ファイルへのパスを指定します(相対パスの場合もあります)。

詳細 ドキュメント内

0
Tomas Briza