Gradle Java项目构建期间替换文件中的单行内容。

10

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

我创建了一个文件'src/main/resources/app-info.properties',其中只有一行'application.version = @version@'。现在,每当该文件被复制到构建文件夹时(认为这在构建任务期间发生),我都想替换此版本字符串。

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

那么,是否有一个简单的解决方案,在构建任务(或处理复制到构建文件夹的任务)期间仅替换一个单独的文件中的标记?

感谢您的任何帮助! Ben

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

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

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

这导致了以下错误:

在根项目上找不到方法from(),参数为[src/main/resources, build_vbjud9ah7v3pj5e7c5bkm490b$_run_closure6_closure12@43ead1a8]

似乎我选择的任务有误?

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

谢谢你,以下是可行的解决方案!

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

10

无论是书籍还是博客,包括Opal的回答在内,都推荐使用exclude/includefrom()filter()的生动混合方法。当然,在我第一次尝试替换index.html文件中的{{app javascript library}}文本以依赖于简单项目属性设置的JavaScript库路径时,我也是这么做的。

问题是我的“war”任务在war档案中生成了重复的index.html文件,并且按照之前所述的模式去解决问题会导致一个巨大难以阅读的hack。

随后,我找到了一个非常简单明了的解决方案。以下示例来自我的构建脚本,你需要根据自己的需求进行一些自定义:

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

你可以使用链式方式替换多行。 line.replace('{{app javascript library}}', "lib/someLib.js") .replace('{{anotherVar}}', "lib/anotherLib.js") - Gabe M

3

粘贴示例代码。您需要做的是包含替换文件并从替换中排除其他文件。这里有一个示例用法。搜索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是从脚本的其他部分定义的映射中获取的过滤器。

抱歉,目前没有示例代码,因为我没有解决方案来替换该行。正如所述,我只想在资源文件中替换一些标记,该文件已经被Java插件复制(考虑构建任务)。那么你认为复制方法会对此有帮助吗? - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接