SpringBoot使用@project.version@出现'@' that cannot start any token. (Do not use @ for indentation)....
出现上面困扰了很久,因为自己本地springboot项目在application.yml配置文件上是可以正常读取到maven指定的版本号的,在springboot admin上面是可以正常显示version。
![](https://img.haomeiwen.com/i14078421/7db07c1cae40c603.png)
如:
info:
version: @project.version@
(意思也就是指定你的微服务版本,使用maven里面指定的版本)
但是,在公司的项目,却不能使用,老是报出这样的异常:'@' that cannot start any token. (Do not use @ for indentation)....
异常信息表明:springboot对于占位符@无法识别。
那么有这种情况,当你的密码等信息包含@等这种特殊符号,怎么在yaml或properties上指定,这时需要使用单引号或者双引号来包起来,这样就能正常识别了。因为他也是把它当做字符处理。
这样百思不得其解,折腾了好几个小时,翻了很多源码,是否哪里解析yaml时进行替换,一直找不到原因。在网上找了好久也没能解决或者方法给我尝试了也不是。
就准备要睡觉了,然后心里还是有一道坎,躺到床上还是用手机进行了搜索了相关的答案,刚好这时,网上出现了这个类似的原因说明,真的太棒了。
引用如下:
你可以使用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,那构建时这些属性将被暴露出去。
总结:
1)springboot项目如果没有指定spring-boot-starter-parent的话,而且想要在配置文件yml或properties上使用@@来获取其它信息等,你就需要在build上增加如下配置:(这个问题就是我公司里的项目上的问题)项目启动或者打包时,IDE会自动将maven信息替换给application配置文件。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
2)如果你的项目有继承spring-boot-starter-parent的话,就不用加上面的配置信息。(这个是我自己本地的项目)。
所以,问题解决,大功告成!你知道了吧!
推荐阅读
长按二维码识别,一键关注干货《搬运工来架构》
网友评论