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

时间:2014-06-15 15:32:33

标签: java build gradle

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

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

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

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

感谢您的帮助! 本

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

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

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

这引发了这个错误:

  

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

好像我做错了什么?

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

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

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

2 个答案:

答案 0 :(得分:8)

书籍和博客等,包括Opal的答案都建议使用exclude/includefrom()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")
            }
        }
    }
}

答案 1 :(得分:3)

粘贴示例代码。您需要做的是包含文件以进行替换,排除替换其他文件。 Here是示例用法。搜索 ReplaceTokens ,你会看到我在说什么。

您需要向processResources任务添加过滤功能。示例代码:

processResources {

    def profile = project.properties['profile']

    def replace_tokens = profile ? filter_tokens[profile] : filter_tokens['default']

    exclude '**/log4j-test.xml'

    from('src/main/resources') {
        exclude '**/*.ttf'
        filter(ReplaceTokens, tokens: replace_tokens)
    }

    from('src/main/resources') {
        include '**/*.ttf'
    }
}

以上ttf(二进制)文件从过滤中排除但已复制。 replace_tokens是从脚本其他部分中定义的地图中获取的过滤器。