You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:22:47