我正在尝试使用 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 2.X 及更高版本时,-Dspring.config.location 应该覆盖所有其他属性文件。
这是我开始调试的地方:
尝试 1:我附加到 docker 容器中,cd 到
/opt/$APP/
我的app.jar
和 application.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 byusing spring.config.location
, they replace the default locationsAlternatively, 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/