使用外部属性覆盖 spring-boot application.properties

Override spring-boot application.properties with external properties

我有一个 spring-boot 应用程序。 我有 3 个属性文件:

  1. spring-boot jar 中的 属性 文件 - myjar.jar 称为 application.properties( 这是jar里面的包)

  2. 一个属性文件在jar外,在configurations/global.properties

    [=下的jar位置45=]
  3. 一个属性文件在jar外,在configurations/java.properties

    [=下的jar位置45=]

问题是,我运行以下命令:

java -Dlogging.config=logback.xml -jar "myjar.jar" spring.config.location=classpath:/application.properties,file:./configurations/global.properties,file:./configurations/java.properties

我得到一个例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myApplication': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'Data.StoresDb.LakeConnectionString' in value "${Data.StoresDb.LakeConnectionString}"
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=13=](AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
        at org.springframework.beans.fa

myApplication.java,我有:

@Value("${Data.StoresDb.LakeConnectionString}")
String dataLakeStoreDb;

并且在我的application.properties中我没有有Data.StoresDb.LakeConnectionString,但是我 在我的 global.properties 中有它,我希望 spring 在尝试为值 Data.StoresDb.LakeConnectionString

服务之前解析所有文件

您将 arg/value 作为原始 Java 参数传递:

java -jar "myjar.jar" spring.config.location=...

参数将出现在主 class 的 String[] args 中,但 Spring 环境不会意识到这一点。
您必须在它前面加上 -- 才能使参数成为 Spring 环境感知:

java -jar "myjar.jar" --spring.config.location=...

来自official documentation :

By default SpringApplication will convert any command line option arguments (starting with “--”, e.g. --server.port=9000) to a property and add it to the Spring Environment

或者作为替代方案将其作为系统传递 属性 :

java -Dspring.config.location=... -jar "myjar.jar" 

附带说明:注意 spring.config.location 覆盖默认位置,而 Spring Boot 2 中引入的 spring.config.additional-location 将指定位置添加到默认位置。