Gradle processResources - 文件包含$ character

时间:2015-11-13 15:31:49

标签: gradle spring-boot

如何对包含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>

据我所知,问题出现是因为其中一个静态文件中有$个字符,$是处理资源时表达式的保留字符。

提议的解决方案:

  1. 是的,使用$(如堆栈跟踪中的建议)转义\$有效,但如果其他选项可用,我宁愿不更改html文件。
  2. 尝试从进程资源中排除该文件会导致问题消失,但副作用还会导致文件被复制:

    configure(tasks.processResources) {
        exclude 'static/dollar.html'
    }
    
  3. 我还看到您可以过滤已处理的资源。我想这就是我想做的,但我没有找到“忽略$ filter”,有没有?

    configure(tasks.processResources) {
        filesMatching('static/dollar.html') {
            filter = ???
        }
    }
    
  4. 其他建议?

  5. 导致问题的dollar.html文件可以简化为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    </head>
    <body>
        <div>Dollar $</div>
    </body>
    

1 个答案:

答案 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}}