java - Spring Boot 外部属性文件

标签 java spring spring-boot docker

我正在尝试使用 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 

另外,我还注入(inject)了 docker 镜像一个补充 application.properties文件位于 /opt/myapp/ .这个外部文件 与此类似:
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和中提琴 - 它有效 !建立与外部 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应该够了吧?

最佳答案

当您指定 -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 :

You can also refer to an explicit location by using the spring.config.location environment property (which is a comma-separated list of directory locations or file paths). When custom config locations are configured by using spring.config.location, they replace the default locations

Alternatively, when custom config locations are configured by using spring.config.additional-location, they are used in addition to the default locations.

关于java - Spring Boot 外部属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271997/

相关文章:

java - 在方法中迭代 ArrayList

java - 线程在 2 个队列中

spring - 能够在应用程序中动态切换持久性单元 (JPA)

Spring 启动 : Not to use TLSv1. 0

spring - 如何将 CORS header 添加到 BasicErrorController 呈现的 Spring 错误页面?

java - Jackson针对不同情况使用不同的解串器

java - Maven - 始终下载最新版本的依赖项或插件

spring - Thymeleaf/Spring MVC - 你如何在链接表达式中嵌套变量/表达式?

java - Spring MVC 将嵌套自定义类型列表绑定(bind)到多个 JSP 表单

java - 如何让 RetryAdvice 为 KafkaProducerMessageHandler 工作