我在类路径资源中有一个内部 application.yml 文件,其中包含以下字段:
redis:
hostname: localhost
port: 6379
database: 0
password:
有一个外部配置文件: config.properties 。它定义了一些在我的服务器上下文中要覆盖的字段。文件 config.properties :
redis.hostname = db.example.com
redis.password = my_password
该应用程序无法启动,因为它无法读取配置文件中的redis.port属性。我的疑问是,如果spring已经在外部文件(在这种情况下为主机名,密码)中找到了某些定义的字段,则不会完全保留属性源( redis )的字段。
我正在使用以下命令运行应用程序:
java -jar -Dspring.config.location=file:///home/username/config.properties application.jar
如何使spring正确覆盖内部配置文件,使其仅覆盖额外的属性(redis.hostname,redis.password),但仍保留内部文件中定义的其他字段(如redis.port,redis)。数据库),但未在外部文件中定义?
P.S:我知道这是怎么回事,因为当我在外部配置文件中添加 redis.port = 6379 属性时,应用程序可以正常工作。
答案 0 :(得分:0)
第1步:阅读Spring Boot documentation:
以相反的顺序搜索配置位置。默认情况下,配置的位置是
classpath:/,classpath:/config/,file:./,file:./config/
。产生的搜索顺序如下:file:./config/ file:./ classpath:/config/ classpath:/
使用
spring.config.location
配置自定义配置位置后,它们会替换默认位置。例如,如果将spring.config.location
配置为值classpath:/custom-config/,file:./custom-config/
,则搜索顺序变为:file:./custom-config/ classpath:custom-config/
第2步:指定正确的值:
-Dspring.config.location=classpath:/,file:///home/username/config.properties
答案 1 :(得分:0)
file:
和
classpath:
在代码中绑定配置时需要指定。指定-D参数时,可以传递相对于jar文件位置的属性文件的地址。