【问题标题】:Gradle java project replace single line in file during buildGradle java项目在构建期间替换文件中的单行
【发布时间】:2014-08-05 12:59:24
【问题描述】:

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

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

我已经尝试过使用 ant 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] 的方法 from()

好像我做错了任务?

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

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

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

【问题讨论】:

    标签: java build gradle


    【解决方案1】:

    书籍和博客(包括 Opal 的回答)都建议使用 exclude/includefrom()filter() 的生动混合。当然,我第一次尝试将index.html 文件中的文本{{app javascript library}} 替换为依赖于简单项目属性设置的JavaScript 库的路径时也是如此。

    困扰我的问题是我的“战争”任务在战争档案中产生了重复的 index.html 文件,并且使用前面描述的模式解决了这个问题,导致了一个巨大的无法读取的 hack。

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

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

    【讨论】:

    • 您可以通过 channing 替换多行。 line.replace('{{app javascript library}}', "lib/someLib.js") .replace('{{anotherVar}}', "lib/anotherLib.js")
    【解决方案2】:

    粘贴示例代码。您需要做的是 include 文件以进行替换,并 exclude 其他文件从替换中。 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 是从脚本其他部分定义的地图中提取的过滤器。

    【讨论】:

    • 对不起,目前没有示例代码,因为我没有解决方案来替换该行。如前所述,我只想替换 已经 由 Java 插件复制的资源文件中的一些标记(想想构建任务)。那么你认为复制方法在这里会有所帮助吗?
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2016-09-03
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多