前言
spring boot 中我们经常会使用 @spring.active@ 来自动切换配置文件,但是使用的时候报错了:
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 24, column 13:
active: @spring.active@
^
解决方案
你可以使用 Maven 的资源过滤(resource filter)自动暴露来自 Maven 项目的属性,如果使用 spring-boot-starter-parent,你可以通过 @..@ 占位符引用 Maven 项目的属性,例如:
app.encoding=@project.build.sourceEncoding@
app.java.version=@java.version@
注 如果启用 addResources 标识,spring-boot:run 可以将 src/main/resources 直接添加到 classpath(出于热加载目的),这就绕过了资源过滤和本特性。你可以使用 exec:java 目标进行替代,或自定义该插件的配置,具体查看插件使用页面。
如果不使用 starter parent,你需要将以下片段添加到 pom.xml 中(<build>
元素内):
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
和(<plugins/>元素内):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
注:如果你在配置中使用标准的 Spring 占位符(比如 ${foo})且没有将 useDefaultDelimiters 属性设置为 false,那构建时这些属性将被暴露出去。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于