如何对包含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>
据我所知,问题出现是因为其中一个静态文件中有$
个字符,$
是处理资源时表达式的保留字符。
提议的解决方案:
$
(如堆栈跟踪中的建议)转义\$
有效,但如果其他选项可用,我宁愿不更改html文件。尝试从进程资源中排除该文件会导致问题消失,但副作用还会导致文件被复制:
configure(tasks.processResources) {
exclude 'static/dollar.html'
}
我还看到您可以过滤已处理的资源。我想这就是我想做的,但我没有找到“忽略$ filter”,有没有?
configure(tasks.processResources) {
filesMatching('static/dollar.html') {
filter = ???
}
}
其他建议?
导致问题的dollar.html
文件可以简化为:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div>Dollar $</div>
</body>
答案 0 :(得分:13)
JB Nizet's comment提供了宝贵的见解。问题确实是由于expand()
的使用(虽然它不是立即可见的,因为它位于父项目的allProjects()
脚本中)。首先添加expand()
的原因是希望填充application.properties
文件中的info.build.*属性(以便它们可以通过Spring Boot的info endpoint获得)。
解决方案:仅filesMatching()
个expand()
个选定文件使用processResources {
filesMatching('application.properties') {
expand(project.properties)
}
}
。以下代码段解决了与Spring Boot相关的特定问题:
{{1}}