irpas技术客

springboot报ScannerException:character ‘@‘ that cannot start any token. (Do not u

未知 2720

1、springboot @@,报ScannerException 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 28, column 20: defaultZone: @eurekaDefaultZone@

在解决问题之前,我们先来看看为什么会出现这个问题??

2、springboot项目使用@@占位符引用maven项目属性

我们知道,在springboot项目中,可以使用Maven的资源过滤(resource filter)自动暴露来自Maven项目的属性,如果使用parent

spring-boot-starter-parent 作为项目的父工程的话,我们可以通过@..@占位符引用Maven项目的属性。

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>

你在maven配置文件 pom.xml中设置启动文件:

<profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <build.profile.id>local</build.profile.id> <profileActive>local</profileActive> </properties> </profile> <profile> <id>production</id> <properties> <build.profile.id>production</build.profile.id> <profileActive>production</profileActive>DefaultZone> </profile> </profiles>

你就可以在application.yml文件里读取到上面profileActive的值:

spring: profiles: active: @profileActive@

这是为什么呢?这是因为,?spring-boot-starter-parent自带自动化的资源过滤,那什么是资源过滤呢?

上面我们为本地环境和开发环境配置了不同的profile,在我们的代码里,就可以使用@xxx@来引用到属性,例如上面例子中,我们默认开启的环境是 带有 activeByDefault = true 的local环境,所以@profileActive@读到的是? profile id = local 的文件下,profileActive的值,即local。

3、ScannerException

但是如果你的springboot项目如果没有指定spring-boot-starter-parent的话,使用@@的时候就会报ScannerException异常:

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 28, column 20: defaultZone: @eurekaDefaultZone@ ^

这时候,你需要在你pom文件的build节点加上如下的配置:

<build> <resources> <resource> <directory>src/main/resources</directory> <!--开启过滤,用指定的参数替换directory下的文件中的参数--> <filtering>true</filtering> </resource> </resources> </build>

启动项目,一切正常,这是因为我们这里手动配置了资源过滤。

但是有个问题,就是我父工程指定的是spring-boot-starter-parent,但是我在bootstrap.yml文件中还是不能使用@@,报错跟上面的一样,而且加了资源过滤就好了,不知道为啥,还要继续研究下,有大神指导的话,感谢科普!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #1SpringBoot #by #while #Scanning #for