我们的应用程序具有我们从Maven项目文件中动态获取的属性。
info:
build:
artifact: @project.artifactId@
name: @project.name@
description: @project.description@
version: @project.version@
当我们使用Eclipse时,这些都不是问题,但现在转移到InelliJ应用程序不会启动,除非我为这些动态属性提供了一些硬编码值。
我收到此错误:
19:47:20.962 [main] INFO com.edlogics.ElrcApplication - Spring Boot configuration: profiles = [local, chris]
19:47:20.968 [main] INFO com.edlogics.ElrcApplication - Spring Boot configuration: properties = {}
Exception in thread "main" while scanning for the next token
found character '@' that cannot start any token. (Do not use @ for indentation)
in 'reader', line 74, column 11:
name: @project.name@
^
org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:420)
org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:226)
org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:586)
org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143)
org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:132)
org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:229)
org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:155)
org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:229)
org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:155)
org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:229)
org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:155)
org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122)
...
Process finished with exit code 1
我意识到@
不是一个有效的YAML字符,只是不确定这是如何在Eclipse中工作而不是在IntelliJ中
修改
我从原始问题中遗漏的一件事是我们有一个多模块项目。它是继承自spring-boot-starter-parent的项目的根pom:
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application.yml</include>
<include>**/application.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application.yml</exclude>
<exclude>**/application.properties</exclude>
</excludes>
</resource>
</resources>
在我们的项目中,它是一个需要过滤的子模块。 application.yml文件位于子模块的正确位置,Eclipse似乎并不介意它是一个子模块。我知道Eclipse和IntelliJ对多模块项目的处理方式略有不同(Eclipse具有扁平结构,而IntelliJ是分层的)。
答案 0 :(得分:2)
原来,资源过滤在IntelliJ中有效。在四个中有一个属性@project.name@
没有被正确过滤。不知怎的,这在Eclipse中不是问题。所以我们刚刚从application.yml中删除了该属性,因为我们没有使用它。
答案 1 :(得分:0)
更新intellij创意(至 2018.1.7 ( 内部版本181.5540.23 ))对我的情况有所帮助!
答案 2 :(得分:0)
添加引号可以解决? 从工件:@ project.artifactId @到=>'工件:@ project.artifactId @'
答案 3 :(得分:0)
它对我有用:
<块引用>工件:'@project.artifactId@'
只需将值保留在单引号内