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

Gradle Kotlin DSL配置sourceSets无法清空源码目录问题求助

Gradle Kotlin DSL 清空SourceSet目录失效的原因与解决方法

核心差异:Groovy与Kotlin DSL的赋值逻辑不同

在Groovy DSL中,srcDirs = []本质是调用SourceDirectorySet.setSrcDirs(Iterable)方法,直接替换整个源目录集合,完全覆盖Gradle默认的约定目录(比如src/main/groovy、src/test/java),从而实现清空效果。

而你在Kotlin DSL中使用的srcDirs.clear(),只是清空了当前集合中你显式添加的目录,但Gradle为SourceSet预设的默认目录是通过约定机制绑定的,这部分内容不会被clear()移除,所以最终输出仍会显示默认目录。另外,你尝试的srcDirs(emptyArray())或srcDirs(emptyList())是调用srcDirs()方法,该方法的作用是追加目录而非替换,自然也无法清空默认目录。

正确的Kotlin DSL配置写法

要实现和Groovy DSL完全一致的清空效果,需要显式调用setSrcDirs()方法,传入空集合来替换整个目录集合:

sourceSets {
    main {
        kotlin.setSrcDirs(listOf("src/main/java"))
        groovy.setSrcDirs(emptyList())
    }
    test {
        java.setSrcDirs(emptyList())
        groovy.setSrcDirs(listOf("src/test/java", "src/test/groovy"))
    }
}

验证方式

添加打印语句验证配置结果:

sourceSets {
    main {
        kotlin.setSrcDirs(listOf("src/main/java"))
        groovy.setSrcDirs(emptyList())
        
        println("main kotlin: ${kotlin.srcDirs}")
        println("main groovy: ${groovy.srcDirs}")
    }
    test {
        java.setSrcDirs(emptyList())
        groovy.setSrcDirs(listOf("src/test/java", "src/test/groovy"))
        
        println("test java: ${java.srcDirs}")
        println("test groovy: ${groovy.srcDirs}")
    }
}

执行后会看到对应的源目录已被正确清空,与Groovy DSL的效果完全一致。

内容的提问来源于stack exchange,提问作者Gondri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:17:31