春季启动外部配置

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 应用程序将首先查看类路径,如果可用,获取应用程序名称以获取基于该名称的其他属性文件。

但是,一旦我指定了文件名,一切正常,所以我想我弄错了。

【讨论】:

嗨,我遇到了同样的情况,各种属性文件位于文件夹和子文件夹下。我不知道如何从这些文件夹中获取/加载所有这些属性文件。如何仅提及文件夹路径以便加载所有属性文件。

以上是关于春季启动外部配置的主要内容,如果未能解决你的问题,请参考以下文章

春季启动MongoDB配置

春季启动CORS配置

春季启动的 logging.config 配置

何时为春季启动执行指定多个配置文件

春季启动 OAuth2

春季启动 jdbc 连接