【问题标题】:Spring boot external properties fileSpring Boot 外部属性文件
【发布时间】:2020-07-30 23:26:33
【问题描述】:

我正在尝试使用 Spring Boot 2.2.4 版运行 java8 应用程序。然后将该应用程序打包在一个 docker 映像中。

我在 Dockerfile 中指定的运行我的应用程序的方式是这样的:

FROM openjdk:8
.....
CMD /usr/local/openjdk-8/bin/java -jar -Dspring.config.location=/opt/$APP/ /opt/$APP/$APP.jar

我遇到的问题是加载外部属性文件。 例如,我有与此类似的 application.properties 文件,它打包在 JAR 中

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=db1
application.queue.sqs.queue_name=somesqs 

此外,我还向 docker 映像注入了一个位于 /opt/myapp/ 的附加文件 application.properties。此外部文件与此类似:

spring.data.mongodb.uri=mongodb://username:password@MONGO_URL:27017/db_name
application.queue.sqs.queue_name=another_sqs

预期行为:应用程序将加载新的another_sqs 位置和外部 mongo 连接。

但是,实际行为:阅读日志时,我可以看到新的 sqs url(即 another_sqs)已正确加载,尽管 mongo 连接的新值被丢弃,因此使用本地嵌入式 mongo 引擎。

我查阅了有关 stackoverflow 的以下帖子,以尝试了解我所遇到的情况:

Spring Boot and multiple external configuration files

但据我了解,当使用 spring 2.X 及更高版本时,-Dspring.config.location 应该覆盖所有其他属性文件。

这是我开始调试的地方:

尝试 1:我附加到 docker 容器中,cd 到 /opt/$APP/ 我的 app.jarapplication.properties 所在的位置,执行以下命令 java -jar app.jar 和 viola - 它有效 !建立与外部 mongo 源的连接。这可以通过 spring 的 docs 中指定的 spring 加载属性文件的优先级来解释。

尝试 2:附加容器,cd 进入 $HOME/,执行 java -jar /opt/$APP/app.jar -Dspring.config.location=/opt/$APP/ - 不要连接到外部 mongo,但会连接到 another_sqs。奇怪的事情 - 只加载了 application.properties 值的一部分?这不就是 spring 1.X 通过从多个文件中添加价值的方式吗?

尝试 3:附加容器,cd 到 $HOME/,执行 java -jar /opt/$APP/app.jar -Dspring.config.location=file:/opt/$APP/applicartion.properties - 相同的行为。

尝试 4:编辑 Dockerfile 以包含以下执行:

CMD usr/local/openjdk-8/bin/java -jar -Dspring.config.location=classpath:/application.properties,file:/opt/$APP/application.properties /opt/$APP/$APP-$VER.jar

而且它又可以工作了another_sqs 和外部 mongo 都在“Try 4”上正确加载。

因此我的问题是:

为什么要明确指定classpath:/application.proeprties-Dspring.config.location=/opt/$APP/-Dspring.config.location=file:/opt/$APP/application.properties 不就够了吗?

【问题讨论】:

  • 您尝试了我的答案的解决方案吗?你找到其他解决方案了吗?
  • @robertobatts - 您的解决方案似乎有效,但我想对我在帖子中描述的行为进行更全面的解释。
  • 其实没有别的解释,因为Spring就是这样工作的。我用 Spring 文档中的引号更新了我的答案

标签: java spring spring-boot docker


【解决方案1】:

当您指定-Dspring.config.location=file:/opt/$APP/application.properties 时,您将使用您的application.properties 覆盖config.location 的默认值。如果你想使用另一个 application.properties,但仍然使用默认属性而不声明它们,你应该使用

-Dspring.config.additional-location=file:/opt/$APP/application.properties

这样,config.location 仍将具有默认值,您将加载外部属性作为附加位置。

来自Spring Documentation

您还可以使用spring.config.location 环境属性(它是目录位置或文件路径的逗号分隔列表)来引用显式位置。 using spring.config.location 配置自定义配置位置时,它们会替换默认位置

或者,当使用spring.config.additional-location 配置自定义配置位置时,除了默认位置之外,还会使用它们。

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2015-06-26
    • 2015-05-14
    • 2018-02-25
    • 2017-08-18
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多