Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring启动外部属性文件_Java_Spring_Spring Boot_Docker - Fatal编程技术网

Java Spring启动外部属性文件

Java Spring启动外部属性文件,java,spring,spring-boot,docker,Java,Spring,Spring Boot,Docker,我正在尝试使用SpringBootVersion2.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.

我正在尝试使用SpringBootVersion2.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中:

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

spring.data.mongodb.uri=mongodb://username:password@MONGO_URL:27017/db_name
application.queue.sqs.queue_name=another_sqs
预期行为:应用程序将加载新的另一个_sqs位置和外部mongo连接

但是,实际行为:在读取日志时,我可以看到新的sqs url(即另一个_sqs)已正确加载,尽管mongo connection的新值已被丢弃,因此正在使用本地嵌入式mongo引擎

我查阅了以下有关stackoverflow的帖子,试图了解我的感受:

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

下面是我开始调试的地方:

尝试1:我将cd连接到docker容器中,放入我的APP.jar和application.properties所在的/opt/$APP/中,执行以下命令java-jar APP.jar和viola-it-works!已建立与外部mongo源的连接。这可以通过spring的中指定的spring加载属性文件的优先级来解释

尝试2:将容器cd连接到$HOME/,执行java-jar/opt/$APP/APP.jar-Dspring.config.location=/opt/$APP/-不连接到外部mongo,但会连接到另一个_sqs。奇怪的事情-只加载了application.properties值的一部分?Spring1.X不是通过从多个文件添加值来工作的吗

尝试3:将容器cd附加到$HOME/,执行java-jar/opt/$APP/APP.jar-Dspring.config.location=file:/opt/$APP/application.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
它又起作用了。另一个_sq和外部mongo都在Try 4上正确加载

因此,我的问题是:

为什么要显式指定classpath:/application.proeprities?-Dspring.config.location=/opt/$APP/或-Dspring.config.location=文件:/opt/$APP/application.properties是否足够?

当您指定-Dspring.config.location=文件:/opt/$APP/application.properties时,您正在用application.properties覆盖config.location的默认值。如果要使用另一个application.properties,但仍使用默认属性而不声明它们,则应使用

-Dspring.config.additional-location=file:/opt/$APP/application.properties
这样,config.location仍将具有默认值,并且您将作为附加位置加载外部属性

从:

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

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


你试过我的答案吗?你找到其他的解决方法了吗?@robertobatts-你的解决方法似乎有效,但是我想对我在帖子中描述的行为有一个更全面的解释。实际上没有其他解释,因为Spring就是这样工作的。我用Spring文档中的引用更新了我的答案
-Dspring.config.additional-location=file:/opt/$APP/application.properties