如何gradle processResources在包含$字符的文件上执行而不转义$文件中的?
gradle processResources
$
我有一些静态html文件位于Spring Boot参考文档/resources/static建议的文件夹中。但是,当我尝试执行时,Gradle会引发异常gradle processResources
/resources/static
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>
据我了解,出现此问题是因为其中一个$静态文件中$有一个字符,并且在处理资源时是表达式的保留字符。
建议的解决方案:
\$
尝试从进程资源中排除文件会导致问题消失,但也会产生副作用,即也从复制中排除文件:
configure(tasks.processResources) { exclude 'static/dollar.html'
}
我还看到您可以过滤处理的资源。我想这是我想做的,但是我没有找到“忽略$过滤器”,有吗?
configure(tasks.processResources) { filesMatching('static/dollar.html') { filter = ??? }
还有其他建议吗?
dollar.html引起问题的文件可以简化为:
dollar.html
<!DOCTYPE html> <html lang="en"> <head> </head> <body> <div>Dollar $</div> </body>
JB Nizet的评论提供了宝贵的见解。问题的确是由于使用的expand()(尽管由于位于allProjects()父项目的脚本中,所以无法立即看到)。首先expand()添加该文件的原因是希望填充文件中的info.build。*属性application.properties(以便可以通过Spring Boot的info端点使用这些属性)。
expand()
allProjects()
application.properties
解决方案:filesMatching()仅用于expand()选定的文件。以下代码片段解决了与Spring Boot相关的特定问题:
filesMatching()
processResources { filesMatching('application.properties') { expand(project.properties) } }