Gradle java项目在构建期间替换文件中的单行

Ben*_*Ben 9 java build gradle

我有一个简单的Gradle构建脚本来编译和打包(类似于应用程序插件)我的Java应用程序.我唯一没有做的就是在一个简单的.properties文件中替换当前版本号.

我用单行'application.version = @ version @'创建了一个文件'src/main/resources/app-info.properties'.不,只要将文件复制到构建文件夹,我想替换此版本字符串(认为这在构建任务期间发生).

我已经尝试过使用蚂蚁ReplaceTokens的简单解决方案.这个替换了版本,但也破坏了资源中的.png文件.

那么有一个简单的解决方案,只需在构建任务期间(或任何处理复制到构建文件夹的任务)替换单个文件中的令牌吗?

感谢您的任何帮助!本

======根据Opal的评论进行编辑=====

根据提示,我添加了以下内容:

import org.apache.tools.ant.filters.ReplaceTokens
// ... 
build {
    from('src/main/resources') { 
        include '*.properties' 
        filter(ReplaceTokens, tokens: [version : project.version]) 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

这引发了这个错误:

无法在根项目中找到来自()的参数[src/main/resources,build_vbjud9ah7v3pj5e7c5bkm490b $ _run_closure6_closure12 @ 43ead1a8]的方法

好像我在做错了什么?

======编辑完整性添加基于Opals建议的解决方案=====

谢谢你,以下是工作解决方案!

processResources {
    from('src/main/resources') {
        include '*.properties'
        filter(ReplaceTokens, tokens: [version : project.version])
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 8

书籍和博客都很相似,包括Opal的答案都建议使用生动的混合物exclude/include,from()filter().当然还有,所以我做了我的第一次尝试的文本替换{{app javascript library}}index.html文件,其依赖于一个简单的项目属性设置一个JavaScript库的路径.

让我感到困惑的是,我的"战争"任务在war存档中产生了重复的index.html文件,并且使用前面描述的模式摆脱了问题,导致了一个巨大的难以理解的黑客攻击.

然后我找到了一个非常直接的解决方案.以下示例来自我自己的构建脚本,您必须自定义它以满足您的需求:

war {
    eachFile { copyDetails ->
        if (copyDetails.path == 'index.html') {
            filter { line ->
                line.replace('{{app javascript library}}', "lib/someLib.js")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)