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

Gradle任务替换.java文件中的字符串,java,gradle,task,Java,Gradle,Task,我想在编译代码之前替换Config.java文件中的几行。我所能找到的只是在复制过程中通过过滤器解析文件。一旦我必须复制它,我就必须将它保存在某个地方——这就是为什么我选择了解决方案:在替换行时复制到临时位置>删除原始文件>将复制的文件复制回原始位置>删除临时文件。有更好的解决方案吗?也许你应该试试蚂蚁的: 任务myCopy 我绝对不会覆盖原始文件 我喜欢基于目录而不是基于文件名,所以如果是我,我会将Config.java放在它自己的文件夹中(例如src/replaceme/java) 我将在$

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

也许你应该试试蚂蚁的:

任务myCopy
  • 我绝对不会覆盖原始文件
  • 我喜欢基于目录而不是基于文件名,所以如果是我,我会将Config.java放在它自己的文件夹中(例如
    src/replaceme/java
  • 我将在
    $buildDir
    下创建一个
    生成的src
    目录,以便通过
    clean
    任务将其删除
  • 您可以使用复制任务和替换令牌筛选器。例如:

    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
    

    为了补充lance java
    的答案,我发现如果您只希望更改一个值,那么这个习惯用法更简单:

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

    警告:请记住,
    复制
    任务仅在源文件更改时运行。如果您希望根据其他条件进行替换,则需要使用Gradle的增量构建功能来指定该情况。

    我已经使用了替换方法,并且它的工作方式完美无缺,但一旦手动编辑Config.java文件,可能会达到一些不需要的状态,因此您的解决方案似乎更好。compileJava.source=[files]到底做什么?它如何知道我是否要替换包'com.example.cfg'中的Config.java,而不是包'com.example.remote.cfg'中同名的文件?正如我所说,我更喜欢使用目录而不是特定的文件名模式。因此,在我的示例中,
    src/replaceme/java
    中的所有内容都将被替换,而与包无关
    compileJava.source generateSources.outputs.files
    调用,最终添加生成的源代码,以便它们与普通源文件一起编译(在
    src/main/java
    中)。我的建议中没有“=”符号。请看另一个提示:小心,我们被烧死了。我们使用-Pversion={version}运行,但该目标一直说源文件不脏,因此我们的新版本从未放入该文件中。它适用于许多事情,但不适用于版本控制。“我们发现了那里的艰难道路。”迪安希尔谢谢你的评论。我不是100%肯定我理解你的意思。你是说你的源文件没有更改,因此Gradle没有按照你想要的方式“更改”它们,即使它应该更改其中的“版本”?我们尝试使用该方法进行版本更改,但如果源文件没有更改,它实际上根本不会运行,并且会进行0替换,因此,当从开发版本切换到发布版本时,我们的输出文件中会出现“要替换的版本令牌”。现在还不确定最好的方法是什么…也许只是归档。我明白了。实际上,复制任务仅在源文件更改时运行。这是它的默认行为。在您的情况下,您应该考虑是什么触发因素导致了这种更换。你想让它在Gradle每次运行时都运行吗?还有其他情况吗?一旦你明白了这一点,你应该使用Gradle的增量构建功能来指定它:例如指定任务的输入、输出或updateToDateWhen。我将在我的答案中添加这个警告。请随意在其他答案上发表同样的评论,他们都关心这个角落的案子
    task generateSources(type: Copy) {
        from 'src/replaceme/java'
        into "$buildDir/generated-src"
        filter { line -> line.replaceAll('xxx', 'aaa') }
    }