在 Jar 中为类路径上的外部文件@PropertySource

2022-09-04 06:40:30

我试图在Jar中使用Spring框架的注释从Jar外部加载属性文件,但它没有找到该文件。@PropertySource

我需要属性文件位于Jar的外部,以便可以对其进行编辑。我不知道文件的确切位置,我想我可以在类路径上的任何位置都有它。

我在我的课堂上使用以下注释。Config

@PropertySource('classpath:stc.properties')

并放置在与创建的Jar文件相同的目录中。我尝试在命令中显式指定类路径,但它仍然找不到该文件:stc.propertiesjava

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


答案 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

这仅在春季4中是可能的


答案 2

使用变量(系统或环境)来获得文件的值,您可以像这样引用您的文件:

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

推荐