本文已参与「新人创作礼」活动,一起开启掘金创作之路。
问题现象:
SpringBoot项目使用 mvn clean package -P dev 进行项目打包启动时无法识别到配置中的spring.profiles.active=@env@ 环境变量。报错内容如下:
Caused by: 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 3, column 13:
active: @env@
^
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:419)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:586)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:124)
从报错信息来看是因为读取 @env@ 环境变量报错,找到该变量,该变量默认由我们自己配置在:bootstrap.yml 或 application.yml 主配置文件中1,配置类容如下:
# 设置环境变量参数,其中 env 是自定义的变量名,与 <env>dev</env> 的标签名一致
spring:
profiles:
active: @env@
解决方法:
将资源目录添加到打包项中,在pom.xml配置文件<project><build>{添加内容}</build></project>里添加resources配置:
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
前提条件:
- 确保pom.xml配置文件
<project></project>里已有环境变量配置:
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<!-- 这里的 <env> 标签名与 spring.profiles.active=@env@ 中的 env 一致 -->
<env>dev</env>
</properties>
<activation>
<!-- 设置为默认 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
- 确保pom.xml配置文件
<project></project>里已有打包插件:
<build>
<!-- 自定义打包后的jar包名称带上环境变量和版本号后缀 -->
<finalName>${project.artifactId}-${env}.${version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Footnotes
-
bootstrap和application的区别:
- bootstrap由父ApplicationContext加载,application由子ApplicationContext加载;
- bootstrap先加载,application后加载;
- bootstrap配置不会被application相同名称的配置覆盖,常用于系统级配置、远程配置中心配置的配置。