【问题标题】:Which application.yml that're in src/main/resources and src/test/resources directories will be used when testing测试时将使用 src/main/resources 和 src/test/resources 目录中的哪个 application.yml
【发布时间】:2018-01-16 03:25:14
【问题描述】:

在 Spring Boot Maven 项目中,src/main/resourcessrc/test/resources 中分别有一个 application.yml 文件。

在运行测试用例时,似乎测试只会使用src/test/resources 目录中的文件。它不会加载两个文件并覆盖src/main/resources/application.yml 中的属性。 如果src/test/resources目录下没有文件,则使用src/main/resources目录下的文件。

spring boot如何加载这两个目录下的application.yml文件?有什么规则?或者这个动作取决于什么?
我在哪里可以在线查找有关此内容的更多信息?

Example:

└───spring-boot-main-test-application-yaml
    ├───pom.xml
    └───src
        ├───main
        │   ├───java
        │   ├───resources
        │       ├───application.yml
        │   
        ├───test
            ├───java
            ├───resources
                └─── application.yml

src/main/resource/application.yml

name: Phil(main)
sample:
  name: Andy(main)

src/test/resource/application.yml

name: Phil(test)
sample:
  name: Andy(test)

案例1:src/main/resource/application.yml 存在
输出:Hello Phil(main),Andy(main)

case2:src/main/resource/application.ymlsrc/test/resource/application.yml 都存在
输出:Hello Phil(test),Andy(test)

case3:src/main/resource/application.ymlsrc/test/resource/application.yml 都存在并在 src/test/resource/application.yml 中注释掉 name
输出:
Error - java.lang.IllegalArgumentException: Could not resolve placeholder 'name' in value "${name}"

这个测试似乎没有从src/main/resource/application.yml 读取属性,所以它找不到name 属性。

【问题讨论】:

    标签: java spring-boot maven-3


    【解决方案1】:

    Spring 检测到这两个目录,就像您说的那样,它正在根据存在和优先级确定要使用的配置。如果你想让 spring 使用特定的设置,你应该定义spring profiles,它可以有专门的设置以及扩展默认设置。

    【讨论】:

    • 在哪里可以找到该主题的在线加载规则(官方解释)?
    • 春季文档页面?
    【解决方案2】:

    我正在使用 yml 文件并确保在构建应用程序时加载这些属性文件,最好在 pom.xml 中有以下配置

    <build>
    
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.yml</include>
                        <include>**/*.jks</include>
    
                    </includes>
                </resource>
            </resources>
            <testResources>
                <testResource>
                    <directory>${project.basedir}/src/test/resources</directory>
                </testResource>
            </testResources>
     ....
    </build>
    

    确保运行构建(如果需要从头开始,例如删除 .m2 中的存储库文件夹 - 这可能根本不需要)现在检查 target/classes,它应该包含所有指定类型的文件

    【讨论】:

      最近更新 更多