Gradle任务替换.java文件中的字符串

Srn*_*zek 15 java task gradle

我想在编译代码之前在Config.java文件中替换几行.我能找到的只是在复制过程中通过过滤器解析文件.一旦我必须复制它,我必须将其保存在某处 - 这就是为什么我去寻求解决方案:在替换行时复制到临时位置>删除原始文件>将复制的文件复制回原始位置>删除临时文件.有更好的解决方案吗?

Sta*_*lav 14

也许你应该尝试像ant的replaceregexp:

task myCopy << {
    ant.replaceregexp(match:'aaa', replace:'bbb', flags:'g', byline:true) {
        fileset(dir: 'src/main/java/android/app/cfg', includes: 'TestingConfigCopy.java')
    }
}
Run Code Online (Sandbox Code Playgroud)

这项任务将取代所有的aaa出现bbb.无论如何,这只是一个例子,你可以在你的目的下修改它或尝试使用ant的类似解决方案.

  • 参见以下方法:[http://stackoverflow.com/a/17572644/890357](http://stackoverflow.com/a/17572644/890357) (2认同)

Vic*_*yew 11

为了补充lance-java答案,如果您只想改变一个值,我发现这个成语更简单:

task generateSources(type: Copy) {
    from 'src/replaceme/java'
    into "$buildDir/generated-src"
    filter { line -> line.replaceAll('xxx', 'aaa') }
}
Run Code Online (Sandbox Code Playgroud)

  • 小心,我们被严重烧伤了。我们使用 -Pversion={version} 运行,但该目标一直说源文件不脏,因此我们的新版本从未放入该文件中。它适用于很多事情,但不适用于版本控制。我们经历了一番艰难才发现。 (2认同)

lan*_*ava 9

  1. 我绝对不会覆盖原始文件
  2. 我喜欢保持基于目录而不是基于文件名,所以如果是我,我会把Config.java放在它自己的文件夹中(例如src/replaceme/java)
  3. 我创建了一个generated-src目录,$buildDir因此它通过clean任务被删除.

您可以使用Copy任务和ReplaceTokens过滤器.例如:

apply plugin: 'java'
task generateSources(type: Copy) {
    from 'src/replaceme/java'
    into "$buildDir/generated-src"
    filter(ReplaceTokens, tokens: [
        'xxx': 'aaa', 
        'yyy': 'bbb'
    ])
}
// the following lines are important to wire the task in with the compileJava task
compileJava.source "$buildDir/generated-src"
compileJava.dependsOn generateSources
Run Code Online (Sandbox Code Playgroud)