SpringBoot启动失败报错,spring.profiles.active:@env@环境变量无法识别报错

3,307 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题现象:

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.ymlapplication.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>

前提条件:

  1. 确保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>
  1. 确保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

  1. bootstrap和application的区别:

    1. bootstrap由父ApplicationContext加载,application由子ApplicationContext加载;
    2. bootstrap先加载,application后加载;
    3. bootstrap配置不会被application相同名称的配置覆盖,常用于系统级配置、远程配置中心配置的配置。