gpt4 book ai didi

java - 如何在编译之前修改 Gradle 项目中的 Java 源代码而不修改磁盘上的文件?

转载 作者:行者123 更新时间:2023-12-03 18:39:35 26 4
gpt4 key购买 nike

我有一个 Gradle 项目。在我的源代码中,我有一些使用相同字符串的注释(除其他外)。然而,这个相同的字符串存在于一个配置文件中,我只想引用那个文件,所以我只需要在一个地方更改这个字符串,以便更改它的所有实例。因此,我必须从文件中读取字符串,这意味着该字符串不是编译时常量。因此我不能使用从文件中读取的字符串作为注释参数。

// I have this.
@Annotation("some_string")
Object a;

@Annotation("some_string")
Object b;


// This doesn't work
String ss = // read a file, fetch the string from the file.

@Annotation(ss)
Object a;

@Annotation(ss)
Object b;

我想知道 Gradle 中是否有一种方法可以在编译之前修改源代码,使我可以用一个变量控制所有注释参数。

即,在源代码中我可以有 @Annotation("%%some_string%%")并替换所有出现的 %%some_string%%使用 Gradle 任务中的变量。用类似的东西简单地修改每个源文件是很容易的
def annotation_variable = // read a file, fetch the string from the file.
for ( f in srcFileTree ) {
def text = file(f).text
file(f).text = text.replaceAll("%%some_string%%", annotation_variable)
}

但是,这将永久修改源文件。因此,我正在寻找一种方法来修改管道中的文件,而无需实际修改磁盘上的文件。有没有办法做到这一点?

最佳答案

将您的 java 模板放在与普通 java 源不同的目录中(例如 src/template/java )。这将减少 Gradle 所需的“工作”,也意味着您的 IDE 不会尝试编译模板。

然后添加一个任务来替换模板中的 token ,并将它们复制到 $buildDir 下的目录中。 (所以它们通过“clean”被删除,也从未提交给git)

task generateJava(type: Copy) {
from 'src/template/java'
into "$buildDir/generated/java"
filter(ReplaceTokens, tokens: [someToken: 'someReplacement'])
}

现在将生成的目录添加到“main”java sourceSet 并将任务连接到 DAG
sourceSets.main.java.srcDir  "$buildDir/generated/java"
compileJava.dependsOn 'generateJava'

假设您的 IDE 具有 Gradle 集成,您的 IDE 现在也应该编译生成的源代码

请参阅 working with files 中的“在复制文件时过滤文件”文档

关于java - 如何在编译之前修改 Gradle 项目中的 Java 源代码而不修改磁盘上的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59692381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com