springboot怎么读取不同yml配置文件

QQ截图20200801144713.png

我配置了三个文件夹,dev、prod、test 代表三个不同的环境配置文件,
然后通过最外层的application.yml来加载不同文件夹的配置文件,
其中system.yml的配置为:

system:
  config: "dev-env"

application-dev.yml为:

#启动端口配置
server:
  port: 8085
#spring配置
spring:
  application:
    name: multi-env  #应用名

但是通过

 @Value("${system.config}")
    public  String config;

报错

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'system.config' in value "${system.config}"

但是可以读取application-dev.yml的配置值

 @Value("${server.port}")
    public  String config;

最外层的application.yml用于动态切换环境

spring:
  profiles:
    active: ${profiles.active} 

pom.xml配置

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <!--使用默认的变量分割符即${}-->
                <configuration>
                    <useDefaultDelimiters>true</useDefaultDelimiters>
                </configuration>
            </plugin>
        </plugins>

        <!-- 测试文件的编译路径设置 -->
        <testResources>
            <testResource>
                <!--这里是关键! 根据不同的环境,把对应文件夹里的配置文件打包-->
                <directory>src/main/resources</directory>
                <includes>
                    <include>application.yml</include>
                </includes>
                <filtering>true</filtering>
            </testResource>

            <testResource>
                <!--这里是关键! 根据不同的环境,把对应文件夹里的配置文件打包-->
                <directory>src/main/resources/${profiles.active}</directory>
                <includes>
                    <include>**/*.yml</include>
                </includes>
                <filtering>false</filtering>
            </testResource>
        </testResources>

        <resources>
            <resource>
                <!--打包该目录下的 application.yml -->
                <directory>src/main/resources</directory>
                <includes>
                    <include>application.yml</include>
                </includes>
                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <!-- ${profiles.active}由profile提供 -->
                <directory>src/main/resources/${profiles.active}</directory>
                <includes>
                    <include>**/*.yml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

        </resources>

        <!-- 定义 filter,即该资源中的值将会用来替换同名属性(设置 filtering 为 true 的资源中的属性)-->
        <filters>
            <filter>
                src/main/resources/${profiles.active}/application-${profiles.active}.yml
            </filter>
        </filters>
    </build>

    <profiles>
        <profile>
            <!-- 本地开发环境 -->
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>

        </profile>

        <profile>
            <!-- 测试环境 -->
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>

        <profile>
            <!-- 生产环境 -->
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>
    </profiles>
阅读 9k
2 个回答

把文件夹去掉就可以了

首先你的appliction-dev.yml能读取到我就觉得不太可能,spring boot读取配置文件是四个要素,目录+文件名+profile+后缀,目录只能指定一个,是不能根据profile动态切换的,否则也没必要把profile加到文件名里了,你说看到了server.port,能确定是你配置的8085吗,还是默认的8080,或者application.yml也有配置?其次要想读到system.yml,需要通过在bootstrap.yml中指定spring.config.name=system,application来实现,否则就只会默认读取application

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题