【Spring boot】第六弹-Spring Boot 使用-多环境配置

第六弹-Spring Boot 使用-多环境配置

实际,在网上可以搜到好多的多环境配置文章,本来不想写,但是昨天有个同事自己做多环境搭建的时候,出了问题,打包出来的jar包,启动一直报以下的问题:

org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '@' that cannot start any token. (Do not use @ for indentation)
 in 'reader', line 28, column 13:
        active: @profiles.active@
                ^

        at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:439)
        at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:248)
        at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:665)
        at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:165)
        at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:59)
        at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:45)
        at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:140)
        at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:119)
        at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:214)

第一、排查pom resources配置

截取一部分报错信息,很明显可以看出是环境配置没有被替换,怎么解决呢?我让他排查了一下pom.xml是否配置了下面内容:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/**
                
            
        
    

同事的反馈检查了,确实配置了。

第二、排查pom profiles的配置

我说你再检查一下你多环境配置信息:

	<!-- 环境 -->
    <profiles>
        <!-- 开发 -->
        <profile>
            <id>dev</id>
            <activation>
                <!--默认激活配置-->
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!--当前环境-->
                <profile.name>dev</profile.name>
                <profiles.active>dev</profiles.active>
                <libScope>compile</libScope>
            </properties>
        </profile>
        <!-- 测试 -->
        <profile>
            <id>test</id>
            <properties>
                <!--当前环境-->
                <profile.name>test</profile.name>
                <profiles.active>test</profiles.active>
                <libScope>compile</libScope>
            </properties>
        </profile>
        <!-- 生产 -->
        <profile>
            <id>prod</id>
            <properties>
                <!--当前环境-->
                <profile.name>prod</profile.name>
                <profiles.active>prod</profiles.active>
                <libScope>compile</libScope>
            </properties>
        </profile>
    </profiles>

同事的反馈检查了,也确实配置了。

第三、排查配置文件名称

我又给同事说,你看看你配置的多环境配置文件名称是不是符合多环境配置的规范,他说我看看:

src/main/resources/
|- application.yml
|- application-prod.yml    
|- application-dev.yml      
|- application-test.yml     

第四、排查 application.yml 文件中的多环境配置

我又给同事说,你看看你配置的多环境配置变量名是什么?

spring:
  profiles:
    active: @profiles.active@

目前看也没问题。他说要不你帮我看一下?
我仔细检查了一下,发现他忽略了一个配置:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/**
                
            
        
    

在 resource-directory中的src/main/resources的配置中,少了

<filtering>true</filtering>

filtering设置为 true,表示利用占位符进行替换。上面的配置先排除 application- 开头的资源文件,然后在根据生效的profile 对应的 env的值,打包对应的 application-xxx.yml 文件。
根本问题找到,同事把上面遗漏的配置加好之后,打包后的jar中的application.yml中的spring.profiles.active的值被替换成了他打包时候命令中的值(dev)。
打包命令如下:

mvn clean package -P dev -Dmaven.test.skip

这里的dev是你要打包的环境名称。

本篇文章真的就只是利用Spring Boot使用多环境配置,其实只是帮小伙伴解决了个问题。
别问我第五弹哪去了,问就是还在写。

第一弹-创建Spring Boot项目
第二弹-启动Spring Boot项目
第三弹-利用Spring Boot开发第一个接口
第四弹-Spring Boot 接口的统一返回设计

你可能感兴趣的:(SpringBoot,spring,boot,后端,java)