一。背景

        项目(微服务)中,几个服务需要打包成公共服务包(基础服务包,其他项目也可以直接应用该服务),并且生成docker 镜像。这就需要在项目启动时动态加载配置,而不应该写固定在 classpath 中的application.yml 配置文件中。

        这时,可以通过在与jar包同级的目录下创建 config/appliation.yml 或者 直接创建 application.yml 文件来覆盖内部的配置。但是要打成 docker 镜像,这里就不能使用这种方法了,否则每次更改配置都要重新打镜像。

        ·这里使用了 在启动时  添加 --spring.config.location 配置,指定 配置文件或者配置文件目录,然后再通过 -v 来做容器文件映射。这样就可以在容器启动时动态指定配置。达到公共服务的目的。

二。问题

工程目录如下:

本地发布目录如下 :

 启动命令:

java -jar docker-test-1.0-SNAPSHOT.jar --spring.config.location=./lala/

基本思路确定了,但是实际应用的过程发生了问题,--spring.config.location 配置不生效。项目启动时,不报错,但是 --spring.config.location 中配置的内容也不生效。

三。解决方案

各种尝试之后,发现,启动类中没有添加启动参数,如下:

 如果不添加启动参数,那么所有启动命令中添加的参数设置都将不生效。。。

正确的启动方式:

 强烈建议,springboot 启动类中添加该启动参数。

四。注意事项

1.使用这种方式,一定要保证 Springboot 项目的 启动类可以接收外部参数,如下:

 

否则,所有命令行中添加的参数都不会生效。

2.--spring.config.location= 可以设置为文件 , 也可以设置为目录。当有多个配置文件时,可以配置为目录,当配置为目录时,一定要注意,目录后需要添加 /

如:

 

3.springboot 2.x版本中,对 --spring.config.location 的语义做了改变,如果启动命令中添加了该配置,则不再读取 classpath 中的配置文件。

4.spring.config.location 设置 在 classpath 中的 appliation.yml 不生效,因为 application.yml 优先级低,很容易被忽略。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐