在Kotlin的build.gradle.kts中构建时移除System.out.println且不修改源文件
解决Gradle编译时移除System.out.println且不修改源文件的方案
原任务的问题在于直接修改了src/main/java下的源文件,导致本地文件被永久改动。要实现只在编译阶段使用修改后的文件、保留原文件不变,可通过创建临时源目录处理文件的方式实现,具体修改如下:
修改后的Gradle任务代码
tasks { // 创建任务:复制源文件到临时目录并移除System.out.println register<Copy>("prepareCleanSources") { // 输入:原Java源文件 from(fileTree("src/main/java") { include("**/*.java") }) // 输出:临时目录,比如build/cleanSources into(layout.buildDirectory.dir("cleanSources")) // 对每个文件执行替换操作 val sysoRegex = "System\\.out\\.println\\((.*?)\\);".toRegex(RegexOption.DOT_MATCHES_ALL) eachFile { filter { line -> line.replace(sysoRegex, "") } } // 配置任务输入输出,让Gradle正确做增量构建 outputs.upToDateWhen { // 只有当原文件变化时才重新执行 source.files.any { file -> file.lastModified() > destinationDir.lastModified() } } } // 配置compileJava任务,使用临时目录的干净源文件 compileJava { // 先执行prepareCleanSources任务 dependsOn("prepareCleanSources") // 替换原源集,改用临时目录的文件 source = layout.buildDirectory.dir("cleanSources") } }
关键说明
- 临时目录隔离:通过
build/cleanSources临时目录存放处理后的文件,完全不触动src/main/java下的原文件。 - 增量构建优化:配置
outputs.upToDateWhen,只有当原源文件修改时才重新执行文件处理,避免重复劳动。 - 正则优化:把原来的正则改成
System\.out\.println\((.*?)\);并加上RegexOption.DOT_MATCHES_ALL,能正确匹配多行的System.out.println语句(比如带换行的参数)。
额外建议
如果需要只在Release构建时执行此逻辑,可以通过构建变体判断:
tasks.withType<JavaCompile>().configureEach { if (name.contains("Release", ignoreCase = true)) { dependsOn("prepareCleanSources") source = layout.buildDirectory.dir("cleanSources") } }
这样就只会在Release编译时使用处理后的文件,Debug构建依然用原文件,方便调试。
内容的提问来源于stack exchange,提问作者Ryu S.
相关产品推荐
相关产品推荐

