【发布时间】:2016-02-15 05:47:42
【问题描述】:
如何对包含$ 字符的文件执行gradle processResources 而不转义文件中的$?
按照Spring Boot reference docs 的建议,我有一些位于/resources/static 文件夹的静态html 文件。但是,当我尝试执行gradle processResources 时,Gradle 会抛出异常
Caused by: org.gradle.api.GradleException:
Could not copy file '[...]/src/main/resources/static/dollar.html'
to '[...]/build/resources/main/static/dollar.html'.
[...]
Caused by: groovy.lang.GroovyRuntimeException:
Failed to parse template script (your template may contain an error
or be trying to use expressions not currently supported): startup failed:
SimpleTemplateScript7.groovy: 1: illegal string body character after dollar sign;
solution: either escape a literal dollar sign "\$5"
or bracket the value expression "${5}" @ line 1, column 10.
out.print("""<!DOCTYPE html>
据我了解,出现问题是因为其中一个静态文件中有一个$ 字符,而$ 是处理资源时表达式的保留字符。
建议的解决方案:
- 是的,用
\$转义$(如stacktrace 中所建议的)是可行的,但如果有其他选项可用,我宁愿不更改html 文件。 -
试图从进程资源中排除文件会导致问题消失,但也有将文件排除在复制之外的副作用:
configure(tasks.processResources) { exclude 'static/dollar.html' } -
我还看到您可以过滤已处理的资源。我想这是我想做的,但我没有找到“忽略 $ 过滤器”,有吗?
configure(tasks.processResources) { filesMatching('static/dollar.html') { filter = ??? } } 其他建议?
导致问题的dollar.html文件可以简化为:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div>Dollar $</div>
</body>
【问题讨论】:
-
processResources 通常只是复制资源,而不做任何其他事情。您可能正在使用 expand (docs.gradle.org/current/dsl/…) 将 ${someProp} 占位符替换为值。向我们展示您的构建文件。
-
@JBNizet 您的假设是正确的,请参阅下面的answer。谢谢!
标签: gradle spring-boot