Spring Boot如何在application.properties中为yaml设置spring.config.location

时间:2016-12-01 15:17:53

标签: spring spring-boot properties environment

我使用spring boot 1.4.2,现在尝试设置属性。

我有四个案例涉及将 .properties .yml 用于外部(内部资源)和本地文件系统(项目文件夹外部)。

.properties 外部(内部资源文件夹)适用于 @Value($ {property.name}) @PropertySource 一个use value属性可以从文件系统加载,如下所示。

@Component
@PropertySource(value="file:C:\\properties\\application-dev.properties")
@PropertySource(value="file:C:\\properties\\application-test.properties")
public class ExternalProperties {
   // ...
}

.yml 在文件名' application.yml'

下,在资源文件夹下效果不佳

.yml可以通过@ConfigurationProperties加载,需要' propdeps-plugin'

我的.yml文件

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App

此代码效果很好

@Component
// external(inside resources)
@ConfigurationProperties(prefix="environments")
// outside project folder
@ConfigurationProperties(locations={"file:C:\\properties\\application.yml"}, prefix = "environments")
public class YamlProperties {

    private Map<String, String> dev = new HashMap<>();
    private Map<String, String> prod = new HashMap<>();

    public Map<String, String> getDev() {
        return this.dev;
    }

    public Map<String, String> getProd() {
        return this.prod;
    }
}

该代码存在已弃用位置属性的问题(我阅读了很多文章,但无法弄清楚)所以我需要查找API文档并找到&#39; ConfigFileApplicationListener&# 39; 来自section

# SPRING CONFIG - using environment property only (ConfigFileApplicationListener)
spring.config.location= # Config file locations.
spring.config.name=application # Config file name.

所以在application.properties上写上面的属性就像这样。

spring.config.location=file:C:\\properties\\application.yml
spring.config.name=application

并重新加载.yml属性(我没有尝试执行jar。我使用war并通过Controller测试)

@Component
@ConfigurationProperties(prefix="environments")
public class YamlProperties {

     private Map<String, String> dev = new HashMap<>();
     private Map<String, String> prod = new HashMap<>();

     public Map<String, String> getDev() {
         return this.dev;
     }

     public Map<String, String> getProd() {
         return this.prod;
     }
}

此代码未从本地文件系统C:驱动器加载.yml,但在资源文件夹中添加application.yml文件时效果不错。

那么如何设置 spring.config.location 来加载.yml

我想了解为什么location属性可以正常工作,尽管自1.4版以来已弃用

并想知道如何使用ConfigFileApplicationListener我无法跟进它难以理解的代码给出一些提示〜!

  

编辑:

     

我想念这一点,当战争再次开始并使之成为现实   上下文再次使用本地文件系统属性。这不是   收集链接它,但留待将来一步。

     

tomcat重启而不是war部署新的,所以我打开了文件   如果我更改此文件的数据,它包含属性的本地系统   当tomcat重启时,可能是过时的属性上下文。

     

为什么我继续尝试这项工作,我使用公共github帐户并保护   将db info连接到其他地方。我得到这些东西然后继续下去   像git-encrpt,spring-cloude,nginx,docker这样的问题。真的感谢你的帮助   有帮助的。

3 个答案:

答案 0 :(得分:1)

由于您使用的是spring boot 1.4.2,一切都很简单。您只需为应用程序指定其他参数,例如java -jar name-of-application-version.jar --spring.config.location=file:///C:/properties/application.yml。实现此目的的更常见方法是为java -Dspring.config.location=file:///d:/private-bootstrap.yml -jar name-of-application-version.jar等JVM定义附加选项。这两种方法都可以工作,因为它们可以在我的桌面上正常工作。

答案 1 :(得分:0)

您可以在调用Spring Boot应用程序时使用spring.config.location属性。下面是一个示例,其中您在自定义位置有4个自定义名称的属性文件。

java -Dspring.config.location=file:/gfs/config/post/post.properties,/gfs/config/post/post_pwd.properties,/myDbConfig/config/db-config.properties,/myserver/config/db-passwd.properties  -jar myapp-1.0-SNAPSHOT.jar

在您的代码中,您可以通过以下方式访问它们:

@Component
public class AppProperties {

    @Value("${post.user.name}")
    private String username;
}

答案 2 :(得分:-2)

这是我们在运行maven spring-boot:时可以使用的命令,如Eclipse一样从IDE运行以提供spring系统属性或命令行参数:

spring-boot:run  -Dspring-boot.run.arguments="--server.port=9091,--spring.config.additional-location=file:external_path/application.properties"