春季启动外部配置
Posted
技术标签:
【中文标题】春季启动外部配置【英文标题】:spring boot external config 【发布时间】:2015-01-08 08:23:31 【问题描述】:我正在尝试将外部属性文件加载到我的 Spring Boot 应用程序中。 最初我在配置类中使用了@PropertySource。 但现在我想删除这个注释,所以这个类不依赖于位置。 所以我尝试使用:
java -jar my-boot-ws.war --SPRING_CONFIG_NAME=file:///Users/TMP/resources/
基于此 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 文档,但我收到以下错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder
使用注释效果很好,但我真的很想摆脱它。 对此的任何帮助都会很棒
谢谢
****** 更正 *******
对不起,上面的命令应该是复制粘贴错误:
java -jar my-boot-ws.war --spring.config.location=file:///Users/TMP/resources/
我不是要更改配置文件的名称,只是添加一个额外的位置。 如此处所述:
如果 spring.config.location 包含目录(而不是文件) 它们应该以 / 结尾(并将附加生成的名称 从 spring.config.name 加载之前)。
我将其解释为文件 $spring.application.name.properties 将从命令行传入的 --spring.config.location 加载
【问题讨论】:
【参考方案1】:spring.config.name=spring
spring.config.location=classpath:/config/
在配置文件夹中 spring.properties 文件可用,在运行服务器时,此属性文件未加载
【讨论】:
【参考方案2】:1) 确保 args 在 run 方法内部传递
public class GemFireTestLoaderApplication
public static void main(String[] args)
SpringApplication.run(GemFireTestLoaderApplication.class, args);
2)如果你在xml注释中配置过或者先删除
<!-- <context:property-placeholder location="classpath:config.properties" /> -->
<!-- <context:property-placeholder location="file:/data/xxx/vaquarkhan/dataLoader/config.properties" /> -->
您可以使用以下命令传递属性名称
3.1)
java -jar GemfireTest-0.0.1-SNAPSHOT.jar --spring.config.location=file:///C:/data/xxx/vaquarkhan/dataLoader/test/config.properties
3.2)
java -jar GemfireTest-0.0.1-SNAPSHOT.jar --spring.config.location=file:///C:/data/xxx/vaquarkhan/dataLoader/test/config.properties
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
【讨论】:
您的第一点是我所缺少的。通过args
有帮助!谢谢!
我遇到了同样的问题。 args 没有被传递。赞成答案和评论。谢谢!【参考方案3】:
在命令行中,您应该使用以下属性来提及额外的启动配置文件:
--spring.config.location="file:/path/to/application.properties"
另一种选择是:
-Dspring.config.location="file:/path/to/application.properties"
注意字符是小写的,单词分隔符是句号..
否则,您可以将环境变量与您已使用的密钥一起使用:
在 *nix 系统中:
export SPRING_CONFIG_NAME=file:/path/to/application.properties
在 Windows 操作系统中:
set SPRING_CONFIG_NAME=file:/path/to/application.properties
【讨论】:
我更正了我上面的陈述,名称不是我想要更改的。我想添加一个位置。 您的问题具有误导性,因为它使用了错误的系统属性名称。重新检查我的答案,如果你觉得它正确,请接受或投票:) 您的回答在技术上是正确的,值得投赞成票,但没有回答预期的问题。对于复制/粘贴错误具有误导性,我深表歉意。 我尊重您的立场,但您最好通过详细步骤以及提供的说明来改善您的回复:) 我认为由于链接中提供了详细步骤,因此无需复制它。【参考方案4】:这可能不是一个常见的问题,但我遇到了。即使你用--spring.config.name
替换它,你的类路径中也必须有一个application.properties
(由于敏感信息,我在gitignore 中有我的)。
【讨论】:
我正在努力实现你所做的。你的外部文件名是什么,你能给我你使用的命令行吗?我试过 ./mvnw -Dmaven.test.skip=true -Dspring.config.additional-location=file:./secret.yml -Dspring.config.name=secret 但这不起作用 嗨 Hamdy,对我有用的方法是在执行时间覆盖,例如,我的命令是:java -jar (JVM OPTS) myLib.jar --spring.config.location= application.properties(在我的情况下,两个文件具有相同的名称,一个在类路径中,另一个在文件系统中)。对于 maven,我们只有 src/main/resources 中的主文件和 src/test/resources 中的测试,这样我们可以覆盖测试的内容。希望对您有所帮助。【参考方案5】:经过一番谷歌搜索后,我发现了这个Spring Boot and multiple external configuration files,表明以下是正确的用法:
java -jar my-boot-ws.war --spring.config.location=file:///Users/TMP/resources/myFile.properties
我的印象是 --spring.config.location 会加载指定目录中的其他属性文件。根据我提到的链接上的帖子,情况并非如此。如果指定了目录,则基于链接,然后搜索 application.properties。但这里http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 的文档再次似乎暗示 Spring Boot 应用程序将首先查看类路径,如果可用,获取应用程序名称以获取基于该名称的其他属性文件。
但是,一旦我指定了文件名,一切正常,所以我想我弄错了。
【讨论】:
嗨,我遇到了同样的情况,各种属性文件位于文件夹和子文件夹下。我不知道如何从这些文件夹中获取/加载所有这些属性文件。如何仅提及文件夹路径以便加载所有属性文件。以上是关于春季启动外部配置的主要内容,如果未能解决你的问题,请参考以下文章