第六弹-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>**/**</include>
</includes>
</resource>
</resources>
</build>
同事的反馈检查了,确实配置了。
第二、排查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>**/**</include>
</includes>
</resource>
</resources>
</build>
在 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 接口的统一返回设计